3 回答

TA貢獻1951條經(jīng)驗 獲得超3個贊
sizeof
它不是一個功能,它是一個操作員。括號不是運算符名稱的一部分。它失敗了,因為生成的值具有無符號類型
size_t
,這導(dǎo)致“通常的算術(shù)轉(zhuǎn)換”-1
轉(zhuǎn)換為無符號,在這種情況下,它是一個非常大的數(shù)字。
基本上你正在比較4 > 0xffffffffu
,或者至少接近它。有關(guān)詳情,請參閱此問題。

TA貢獻1848條經(jīng)驗 獲得超6個贊
if語句中>運算符的操作數(shù)是
sizeof(int)
和-1
。sizeof(int)
是類型size_t
,保證是無符號整數(shù)。在實踐中,size_t
很可能至少與unsigned int
那里的任何系統(tǒng)一樣大。-1
是類型int
,相當(dāng)于signed int
。不會發(fā)生整數(shù)提升,因為兩個操作數(shù)都是足夠大的整數(shù)類型。
然后根據(jù)正式稱為通常算術(shù)轉(zhuǎn)換的C規(guī)則平衡兩個操作數(shù)。
這些狀態(tài)(C11 6.3.1.8):
...
否則,如果帶有符號整數(shù)類型的操作數(shù)的類型可以表示具有無符號整數(shù)類型的操作數(shù)類型的所有值,則具有無符號整數(shù)類型的操作數(shù)將轉(zhuǎn)換為帶有符號整數(shù)類型的操作數(shù)的類型。
否則,兩個操作數(shù)都轉(zhuǎn)換為無符號整數(shù)類型,對應(yīng)于帶有符號整數(shù)類型的操作數(shù)的類型。
上面的后者將會發(fā)生,因為(簽名)
int
不能適合a的所有值size_t
。因此
-1
轉(zhuǎn)換為無符號整數(shù)。實際上,size_t
很可能等同于unsigned int或unsigned long。在這樣的變量中存儲-1時發(fā)生的是實現(xiàn)定義的行為。在二進制補碼計算機上(世界上所有計算機的99.9%),-1將被解釋為
0xFFFFFFFF
(FF的數(shù)量取決于給定系統(tǒng)上int的大?。?/p>4 > 0xFFFFFFFF
評估為假。
- 3 回答
- 0 關(guān)注
- 613 瀏覽
添加回答
舉報