st_size
是defined作爲off_t
。爲什麼struct stat中的st_size字段被簽名?
off_t
是defined作爲帶符號整數類型。
爲什麼st_size
定義爲簽名類型?它可能是負面的嗎?如果它是負面的,它意味着什麼?
st_size
是defined作爲off_t
。爲什麼struct stat中的st_size字段被簽名?
off_t
是defined作爲帶符號整數類型。
爲什麼st_size
定義爲簽名類型?它可能是負面的嗎?如果它是負面的,它意味着什麼?
我能想到的最好的理由是避免引入一個未簽名的off_t
作爲額外的類型; POSIX已經有了類似用途的整數類型的荒謬豐富。
除此之外,能夠在st_size
中存儲-1時,大小不是一個有意義的概念可能是有用的;我不知道是否有任何實現這樣做,我找不到POSIX對st_size
的內容提出任何要求,除了常規文件和符號鏈接...
off_t
定義文件中的偏移量,該偏移量可能等於文件的大小,但也可以是負值,例如向後搜索。
從偏移量和大小的關係可以看出,文件大小與文件偏移量具有相同的類型。總之,文件大小不應爲負數。
off_t
用於處理許多函數中的文件偏移量。某些函數使用特殊值-1(例如lseek
這樣做會告訴您發生了錯誤)。在UNIX中對許多其他數據類型進行簽名以適應-1值(例如time_t
)。
請注意'lseek'的參數是* relative *文件的位置(offset),這是'off_t'需要被簽名的主要原因。事實上,你只能尋求正面的絕對文件位置,這就限制了文件不能大於(signed)類型'off_t'的最大值,所以沒有'filesize_t'這個無符號大於值。 –
我認爲POSIX中的某些fseek函數需要接受負數作爲抵消。
根據C的推廣規則,組合不同大小簽名類型的表達式將表現相同的算術正確時尚,無論大小如何,只要中間計算沒有溢出。但是,添加無符號類型會使代碼的行爲更依賴於整數大小。
考慮:
int test_size(off_t x, long y, long long z)
{
return x-y > z;
}
如果off_t
是無符號,然後根據它的大小可能會導致y
獲得 晉升爲unsigned long
,與該類型進行計算,然後將得到提升到signed long long
比較與z
使用經過簽名的比較,或者可能導致z
被升級爲unsigned long long
,在這種情況下,整體比較將以無符號方式完成。也可以(儘管不一定可能)off_t
可能足夠小(和/或足夠大),使用有符號算術減去y
。
僅當有理由相信它們不適合特定簽名時,通常應該用無符號類型表示的數量可能大到至少與int
一樣大,即使它們永遠不會爲負數類型,但肯定會適合其未簽名的對應。這種情況並不常見,但在16位系統上以size_t存在(單個對象的體系結構不可能超過64K,但超過32K的對象是司空見慣的)。在文件系統接口中,這種情況看起來不那麼引人注目(如果32位有符號數不夠,32位無符號數可能還不夠長)。
混合型數學有趣的話語。在這個假設中使用'x-y * 1LL> z'可能會有所幫助,但仍然存在角落缺陷。嗯。 – chux
POSIX在哪裏爲常規文件提供'st_size'的需求? – user1290696
POSIX需要'st_size'來反映文件的常規文件的實際大小,並要求它反映符號鏈接的符號鏈接長度。符號鏈接的要求用'stat'記錄;對常規文件的要求似乎在這裏省略了,但是sys/stat.h'的文檔說對於常規文件,'st_size'是文件的大小(以字節爲單位)。 –