2016-12-03 75 views
0

不少類似的問題已經被問過,但它仍然令我感到困惑如何未簽名的-1 = -1簽署

unsigned int a = -1; 
int b = ~0; 
if (a == b) 
    printf("%u\t%d", a, b); 

回報

4294967295 -1

我明白值是如何存儲在C中,爲什麼它顯示這些數字,但我的問題是,a==b如何在這裏返回true

+2

因爲您似乎正在使用它,所以我添加了C標記。 –

+0

爲什麼它與上面鏈接中的問題不同,是無符號變量初始化爲'-1' - 一個負值。這裏的問題是關於比較 – Paulo

回答

3

通過混合有符號無符號比較的規則,a == b等價於a == (unsigned) b,即比較在無符號類型的域中執行。

~0的結果是全1位模式。在有符號整數類型中,這個模式在2的補碼平臺上代表-1。這意味着您已使用-1初始化您的b(經您的printf確認)。

所以,你的比較實際上是(unsigned) -1 == (unsigned) -1。難怪它是真實的。

但請記住,相等仍然依賴於實現,因爲它取決於2的補碼錶示的屬性。只要C語言正式支持替代符號整數表示(符號和大小,1的補碼),平等就取決於它。

+0

而是說比較是在無符號類型的域中執行的,你應該說比較是一點一點的。實際上,在二進制補碼錶示中,十六進制a等於0xFFFFFFFF(32位平臺),數學上等於-1 =( - 2^31 + 2^31-1)=(0xFFFFFFFF)。並且b =〜0使得所有位都被設置爲1,即十六進制b = 0xFFFFFFFF。這解釋瞭如果條件返回true。 – shamba

+0

@shamba:絕對不是!恰恰相反,C語言根據C語言的規則進行比較,而不是「一點一滴」。在C中沒有「一點一滴」的比較。在這種情況下,我們很幸運,因爲我們使用2的補碼機器,其中有符號的'〜0'產生'-1'。在1的補碼機器上,'〜0'不會產生'-1'(那裏'0xFFFFFFFF'爲「負零」),並且等式不會成立,即使底層的原始表示仍然會「一點一點地匹配」 。 – AnT

+0

@AnT你能否參考一些材料?參考比較等於'(無符號)-1 ==(無符號)-1'。我明白b怎麼變成-1,已經知道了,但比較呢? – Paulo

相關問題