2012-09-05 70 views

回答

3

我能想到的最好的理由是避免引入一個未簽名的off_t作爲額外的類型; POSIX已經有了類似用途的整數類型的荒謬豐富。

除此之外,能夠在st_size中存儲-1時,大小不是一個有意義的概念可能是有用的;我不知道是否有任何實現這樣做,我找不到POSIX對st_size的內容提出任何要求,除了常規文件和符號鏈接...

+0

POSIX在哪裏爲常規文件提供'st_size'的需求? – user1290696

+0

POSIX需要'st_size'來反映文件的常規文件的實際大小,並要求它反映符號鏈接的符號鏈接長度。符號鏈接的要求用'stat'記錄;對常規文件的要求似乎在這裏省略了,但是sys/stat.h'的文檔說對於常規文件,'st_size'是文件的大小(以字節爲單位)。 –

2

off_t定義文件中的偏移量,該偏移量可能等於文件的大小,但也可以是負值,例如向後搜索。

從偏移量和大小的關係可以看出,文件大小與文件偏移量具有相同的類型。總之,文件大小不應爲負數。

0

off_t用於處理許多函數中的文件偏移量。某些函數使用特殊值-1(例如lseek這樣做會告訴您發生了錯誤)。在UNIX中對許多其他數據類型進行簽名以適應-1值(例如time_t)。

+2

請注意'lseek'的參數是* relative *文件的位置(offset),這是'off_t'需要被簽名的主要原因。事實上,你只能尋求正面的絕對文件位置,這就限制了文件不能大於(signed)類型'off_t'的最大值,所以沒有'filesize_t'這個無符號大於值。 –

1

我認爲POSIX中的某些fseek函數需要接受負數作爲抵消。

2

根據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位無符號數可能還不夠長)。

+0

混合型數學有趣的話語。在這個假設中使用'x-y * 1LL> z'可能會有所幫助,但仍然存在角落缺陷。嗯。 – chux

相關問題