2012-09-05 68 views

Trả lời

3

Lý do tốt nhất tôi có thể nghĩ là tránh giới thiệu phiên bản chưa ký off_t làm loại bổ sung; POSIX đã có một sự phong phú vô lý của các loại số nguyên với cách sử dụng tương tự.

Bên cạnh đó, có thể lưu trữ -1 trong st_size khi kích thước không phải là một khái niệm có ý nghĩa có thể hữu ích; Tôi không chắc liệu có triển khai nào thực hiện việc này hay không và tôi không thể tìm thấy nơi POSIX đặt bất kỳ yêu cầu nào về nội dung của st_size ngoại trừ các tệp thông thường và các liên kết ...

+0

POSIX đặt yêu cầu về 'st_size' cho các tệp thông thường ở đâu? – user1290696

+0

POSIX yêu cầu 'st_size' để phản ánh kích thước thực của tệp đối với các tệp thông thường và yêu cầu nó phản ánh độ dài liên kết tượng trưng cho các liên kết tượng trưng. Yêu cầu đối với các liên kết tượng trưng được ghi lại bằng 'stat'; yêu cầu đối với các tệp thông thường dường như bị bỏ qua ở đó, nhưng tài liệu cho 'sys/stat.h' nói rằng đối với các tệp thông thường,' st_size' là kích thước của tệp theo byte. –

2

off_t xác định khoảng bù trong tệp, có thể bằng kích thước của tệp, nhưng cũng có thể âm, ví dụ: nếu tìm ngược lại.

Từ mối quan hệ này giữa bù đắp và kích thước, kích thước của tệp có cùng loại với tệp bù. Nhưng dù sao, kích thước tệp không được âm.

0

off_t được sử dụng để xử lý bù đắp tệp trong nhiều chức năng. Một số hàm sử dụng giá trị đặc biệt -1 (ví dụ: lseek thực hiện điều đó để cho bạn biết một lỗi đã xảy ra). Nhiều loại dữ liệu khác được ký bằng UNIX để chứa các giá trị -1 (ví dụ: time_t).

+2

Lưu ý rằng đối số 'lseek' là vị trí tệp * tương đối * (bù trừ), đó là lý do chính' off_t' cần được ký. Và thực tế là bạn chỉ có thể tìm kiếm các vị trí tệp cực kỳ tuyệt đối áp đặt một hạn chế rằng các tệp không thể lớn hơn giá trị tối đa của loại (đã ký) 'off_t', vì vậy không sử dụng trong tệp' filesize_t' được giữ để giữ lớn hơn giá trị. –

1

Tôi nghĩ rằng một số chức năng fseek trong POSIX cần phải chấp nhận phủ định là offset.

2

Theo quy tắc quảng bá của C, biểu thức kết hợp các kích thước khác nhau của các loại đã ký sẽ hoạt động theo cùng một thời điểm chính xác bất kể kích thước có liên quan với nhau. Tuy nhiên, việc thêm các kiểu unsigned sẽ làm cho hành vi của mã phụ thuộc nhiều hơn vào kích thước nguyên.

Given:

int test_size(off_t x, long y, long long z) 
{ 
    return x-y > z; 
} 

Nếu off_t là unsigned, sau đó tùy thuộc vào kích thước của nó có thể gây ra y để có được thăng unsigned long, với tính toán thực hiện trên kiểu đó, mà sau đó sẽ được thăng tiến để signed long long và so sánh với z sử dụng so sánh đã ký hoặc có thể gây ra z để được thăng cấp lên unsigned long long, trong trường hợp đó, việc so sánh tổng thể sẽ được thực hiện theo cách không ký. Nó cũng sẽ có thể (mặc dù không nhất thiết có khả năng) rằng off_t có thể đủ nhỏ (và/hoặc long đủ lớn) mà y được trừ bằng cách sử dụng số học đã ký.

Số lượng có thể đủ lớn để yêu cầu thứ gì đó lớn nhất là int, ngay cả khi chúng không bao giờ bị âm, thường chỉ được thể hiện bằng các loại chưa ký nếu có lý do để tin rằng chúng không phù hợp với chữ ký cụ thể loại nhưng chắc chắn sẽ phù hợp với đối tác chưa ký của nó. Các tình huống như vậy không quá phổ biến, nhưng tồn tại với size_t trên các hệ thống 16 bit (nó không thể về mặt kiến ​​trúc cho một đối tượng vượt quá 64K, nhưng các đối tượng trên 32K là phổ biến).Một kịch bản như vậy có vẻ kém hấp dẫn hơn trong giao diện hệ thống tập tin (nếu 32-bit đã ký là không đủ, 32-bit unsigned có thể sẽ không đủ cho một trong hai thời gian dài).

+0

Bài diễn văn thú vị về toán học kiểu hỗn hợp. Sử dụng 'x-y * 1LL> z' trong giả thuyết này có thể giúp ích một chút, nhưng vẫn có lỗi ở góc. Hừm. – chux

Các vấn đề liên quan