2013-07-10 59 views
-3

我嘗試了較舊的帖子,但無法理解以下行爲。
https://stackoverflow.com/questions/12295168/c-signed-unsigned-mismatch
unsigned int and signed char comparison未簽名並在C中籤名的行爲

#define T  long 

int main() 
{   
unsigned T a; 
T b; 
a=1; 
b=-1;  
if(a>b)  
    printf("True\n"); 
else 
    printf("False\n"); 

return 0; 
} 

我試圖上述T代碼=炭,短整型,長。
char和short的觀察輸出爲TRUE,而int和long的觀察輸出爲FALSE。我在Ubuntu gcc中嘗試了上面的代碼。
任何人都可以解釋,爲什麼我得到不同的數據類型的輸出?

+7

重複數百次以上。你不瞭解你連接的問題的答案嗎? –

+2

請不要僅因爲它是重複的才能投票這個問題。與其他問題相比,這個問題其實寫得很好。 –

+0

我可以參考你[這](http://stackoverflow.com/questions/17312545/type-conversion-unsigned-to-signed-int-char/17312760#17312760)鏈接? – Nobilis

回答

3

當反對簽署b值測試的charshort價值被擴大到int這種複製符號位,而爲a值的符號位是不可複製的。

因此對於char if變成if (0x00000001 > 0xFFFFFFFF)並且這是真實的(假設32位int)。

但是,當使用unsignedint或更大時,測試使用無符號比較完成。

+0

我試過了,如果((unsigned int)a>(int)b),每次我得到FALSE輸出,不管a和b變量的數據類型如何。爲什麼它表現得像這樣? –

1

char在您比較兩個變量的情況下被提升爲int

讓我們來看看什麼類型的char下發生:

a被提升到一個int,它仍然爲1 b也提升爲int,符號被保留下來,它也仍然是-1。是1> -1?是!

又是怎麼回事int類型:

由於有作爲unsigned操作數涉及到所有的人都將被轉換爲unsigned。在a的情況下,已經無符號1保留原樣。但是,b已簽名,因此我們需要丟失符號。

由於在32位機器上的基礎位表示,-1實際上與4294967295具有相同的位。最後,比較1是否大於4294967295。我認爲答案很明顯。

+0

我試過了,如果((unsigned int)a>(int)b),每次我得到FALSE輸出,不管a和b變量的數據類型如何。爲什麼它表現得像這樣? –

+0

@EmbeddedProgrammer當您比較簽名操作數和未簽名操作數時,已簽名的操作數總是**轉換爲無符號,並且沒有任何數量的轉換會改變它。如果你想得到'真',你需要將無符號操作數轉換爲符號 - 'if((int)a>(int)b)'。或者,例如對於'a'和'b'具有以下值:'a = 2223456789; B = -2123456789;如果((無符號)a>(int)b)'。始終考慮下面的二進制表示。 – Nobilis

+0

Nobilis,爲什麼if(a> b)給出char和unsigned char爲TRUE。正如你所解釋的,它被轉換爲int,但是當我將a和b轉換爲十六進制值時,a = 1和b = -2147483648.it可以,但是當我嘗試int或long時。那麼a = 1和b = -2147483648。那麼爲什麼我變得FALSE?它應該是TRUE。 –