2015-08-08 30 views
2

這是代碼,無符號變量的行爲就像簽署

#include <stdio.h>                              
int main() 
{ 
    unsigned int i = 0xFFFFFFFF; 
    if (i == -1) 
     printf("signed variable\n"); 
    else 
     printf("unsigned variable\n"); 
    return 0; 
} 

這是輸出,

signed variable 

爲什麼i的價值-1即使它被聲明爲無符號? 它與隱式類型的對話有關嗎?

這是構建環境,

Ubuntu 14.04, GCC 4.8.2 
+3

當不同類型進行比較或參與操作時,請看C語言中的類型提升規則。當你比較'i == -1'時,值'-'1'被轉換爲無符號,然後進行比較。在這種情況下,「-1」變爲「0xFFFFFFFF」,然後匹配「i」。 – lurker

+1

在http://stackoverflow.com/questions/5087992/unsigned-int-and-signed-char-comparison上描述的C99的第6.3.1.8節,通常的算術轉換。 – jarmod

+0

在下面的帖子中有一個很好的答案 http://stackoverflow.com/questions/1863153/why-unsigned-int-0xffffffff-is-equal-to-int-1 – BJU

回答

2

==運算符根據C的升級規則將其操作數升級爲常用類型。將-1轉換爲unsigned得到UINT_MAX

1

i的值是0xFFFFFFFF,這是完全一樣-1,至少當後來被轉換成無符號整數。這正是比較運算符所發生的情況:

如果兩個操作數都具有算術類型,則會執行通常的算術轉換。 [...]

[N1570 $ 6.5.9/4]

-1在補是 「所有位設置」,這也是什麼0xFFFFFFFFunsigned int(大小爲4的)是。