2 回答

TA貢獻(xiàn)2036條經(jīng)驗 獲得超8個贊
sizeof返回的size_t
是無符號的,因此-1
被轉(zhuǎn)換為非常大的無符號數(shù)。使用正確的警告級別會對此有所幫助,clang
使用-Wconversion
或-Weverything
(注意這不是生產(chǎn)用途)標(biāo)志警告我們:
warning: implicit conversion changes signedness: 'int' to 'unsigned long' [-Wsign-conversion] if (sizeof(int) > -1) ~ ^~
對于gcc
您使用-Wextra
標(biāo)志收到類似的警告:
warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if (sizeof(int) > -1) ^
作為參考,我們知道的size_t是無符號來自C99標(biāo)準(zhǔn)草案部分7.17
的通用定義它說:
size_t
這是sizeof運算符的結(jié)果的無符號整數(shù)類型; [...]
注意,它沒有指定關(guān)于類型的任何其他內(nèi)容,在我的特定情況下,它恰好是unsigned long,但它不一定是。
的轉(zhuǎn)化-1
是由于正常的算術(shù)轉(zhuǎn)換覆蓋部6.3.1.8
通常的算術(shù)轉(zhuǎn)換這表示:
[...]
否則,如果具有無符號整數(shù)類型的操作數(shù)的秩大于或等于另一個操作數(shù)的類型的秩,則具有有符號整數(shù)類型的操作數(shù)將轉(zhuǎn)換為具有無符號整數(shù)類型的操作數(shù)的類型。
否則,如果帶有符號整數(shù)類型的操作數(shù)的類型可以表示具有無符號整數(shù)類型的操作數(shù)類型的所有值,則具有無符號整數(shù)類型的操作數(shù)將轉(zhuǎn)換為帶有符號整數(shù)類型的操作數(shù)的類型。
否則,兩個操作數(shù)都轉(zhuǎn)換為無符號整數(shù)類型,對應(yīng)于帶有符號整數(shù)類型的操作數(shù)的類型。
因此,唯一的時間-1
不會被轉(zhuǎn)換為無符號值,如果int可以表示size_t的所有值,這不是這里的情況。
為什么-1
最終成為一個大的無符號值,實際上它最終成為無符號類型的最大值是由于6.3.1.3
Signed和無符號整數(shù)部分所說的:
否則,如果新類型是無符號的,則通過重復(fù)地添加或減去一個可以在新類型中表示的最大值來轉(zhuǎn)換該值,直到該值在新類型的范圍內(nèi)。49)
所以我們最終得到:
-1 + (UMAX + 1)
這是:
UMAX
因此最終得到:
if (sizeof(int) > UMAX )

TA貢獻(xiàn)1817條經(jīng)驗 獲得超14個贊
因為sizeof()
返回一個size_t
無符號類型。由于在比較之前進(jìn)行隱式轉(zhuǎn)換,比較有符號和無符號類型可能會產(chǎn)生令人驚訝的結(jié)果。
- 2 回答
- 0 關(guān)注
- 876 瀏覽
添加回答
舉報