2015-09-30 130 views
2

爲什麼下面的程序給出的輸出結果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(); 
} 
+0

你能澄清你的問題?你爲什麼不期望12> -2? – michaelrccurtis

+0

恩,數學同意你的結果。 –

+0

查看[常規算術轉換](http://www.tutorialspoint.com/cprogramming/c_type_casting.htm) – Missu

回答

1

首先,引述C11標準關係運算符,章6.5.8

如果兩個操作數有算術類型,通常的算術轉換是執行 。現在

,按照章節6.3.1.8的描述,常見的算術轉換,如果你嘗試將signedunsigned整數(類型)之間進行運算時,signed人會得到提升到unsigned類型(排名較高),然後進行手術。

所以,在這裏,爲比較,b值越來越轉換爲unsigned類型,你得到錯誤輸出那裏。

引述的有關部分,從同一章

[...]。否則,兩個操作數被轉換爲對應於與符號整型操作數的類型的無符號整數類型 。

您還可以檢查正常的算術提升規則here

也就是說,void main()int main(int argc, char* argv[]),或者,至少,int main(void)

+0

比較不是算術運算。 – Psytho

+0

@ Alex.S'如果兩個操作數都具有算術類型,則通常的算術轉換是 執行.' –

+0

@ Alex.S如何比較而不是算術操作? – chux

0

它的類型提升規則:如果一個參數是int,另一個是unsigned int那麼int被提升到unsigned int,添加必要的UINT_MAX + 1。

這發生在比較之前。

0
if(a>b) 

在這種aunsigned intbsigned int,所以由於隱式轉換,b將被轉換爲unsigned int typeb將具有大的值(沒有必要說,這將是比a更大)。

因此,你會得到意想不到的結果。

根據C99- 6.3.1.8通常的算術轉換

[...]

3。否則,如果具有無符號整數類型的操作數的級別大於或等於另一操作數的類型的級別,則具有有符號整數類型的操作數將轉換爲具有無符號整數類型的操作數的類型。

0

要執行比較,兩個操作數首先轉換爲相同的類型。在這種情況下,int b被轉換爲更高的排名unsigned。對於比較值,則是12 > (-2 + (UINTMAX + 1))?這是錯誤的。

要在平時的數學意義上的比較:

unsigned int a; 
int b; 

if ((b < 0) || (a > b)) printf("a is greater"); 
相關問題