爲什麼下面的程序給出的輸出結果b大於a? 即使b包含-2。將無符號整數變量轉換爲帶符號變量
void main()
{
unsigned int a=12;
int b=-2;
if(a>b)
printf("a is greater");
else
printf("b is greater");
getch();
}
爲什麼下面的程序給出的輸出結果b大於a? 即使b包含-2。將無符號整數變量轉換爲帶符號變量
void main()
{
unsigned int a=12;
int b=-2;
if(a>b)
printf("a is greater");
else
printf("b is greater");
getch();
}
首先,引述C11
標準關係運算符,章6.5.8
如果兩個操作數有算術類型,通常的算術轉換是執行 。現在
,按照章節6.3.1.8的描述,常見的算術轉換,如果你嘗試將signed
和unsigned
整數(類型)之間進行運算時,signed
人會得到提升到unsigned
類型(排名較高),然後進行手術。
所以,在這裏,爲比較,b
值越來越轉換爲unsigned
類型,你得到錯誤輸出那裏。
引述的有關部分,從同一章
[...]。否則,兩個操作數被轉換爲對應於與符號整型操作數的類型的無符號整數類型 。
您還可以檢查正常的算術提升規則here
也就是說,void main()
應int main(int argc, char* argv[])
,或者,至少,int main(void)
。
它的類型提升規則:如果一個參數是int
,另一個是unsigned int
那麼int
被提升到unsigned int
,添加必要的UINT_MAX + 1。
這發生在比較之前。
if(a>b)
在這種a
是unsigned int
和b
是signed int
,所以由於隱式轉換,b
將被轉換爲unsigned int type
和b
將具有大的值(沒有必要說,這將是比a
更大)。
因此,你會得到意想不到的結果。
根據C99- 6.3.1.8通常的算術轉換
[...]
3。否則,如果具有無符號整數類型的操作數的級別大於或等於另一操作數的類型的級別,則具有有符號整數類型的操作數將轉換爲具有無符號整數類型的操作數的類型。
要執行比較,兩個操作數首先轉換爲相同的類型。在這種情況下,int b
被轉換爲更高的排名unsigned
。對於比較值,則是12 > (-2 + (UINTMAX + 1))
?這是錯誤的。
要在平時的數學意義上的比較:
unsigned int a;
int b;
if ((b < 0) || (a > b)) printf("a is greater");
你能澄清你的問題?你爲什麼不期望12> -2? – michaelrccurtis
恩,數學同意你的結果。 –
查看[常規算術轉換](http://www.tutorialspoint.com/cprogramming/c_type_casting.htm) – Missu