2 回答

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