2017-10-16 408 views
-2

我知道當我們比較帶符號和無符號時,編譯器將我們的帶符號值轉換爲無符號值,當我們比較short和int時,編譯器將較小類型轉換爲較大類型。但是我編寫了這段代碼來檢查我們是否比較了一個帶符號的int x = 0xdeadbeef和unsigned short y = 0xffff,然後在將unsigned short轉換爲int之後,我們應該在y的比較處應該有0x0000ffff,它應該小於x的無符號值。但是我的代碼沒有進入if條件,即x大於y。有人可以向我解釋爲什麼?C++中signed int和unsigned short的比較

代碼片段:

#include<iostream> 
using namespace std; 

int main(){ 

     unsigned int x=0xDEADBEEF; 
     unsigned short y= 0xFFFF; 

     if((signed)x > y) 
       cout<<"X is larger"<<endl; 

    return 0; 
} 

當運行的代碼,不打印 「X較大」。

+0

因爲(有符號)x是負數。 – cleblanc

+0

但是,當比較無符號到一個簽名不應該編譯器將其轉換回無符號? –

+0

btw你的代碼是** C++ ** –

回答

0

當您從無符號到有符號類型轉換x時,它會導致整數溢出。請注意,signed int可以保持比unsigned int更小的正值。所以當發生整數溢出時,在大多數平臺上,它會像你的車的里程錶一樣動作。即一旦int值超過它可以存儲的最大值,它就從頭開始。在32位系統(int32)上使用signed int的'開始'將是-2,147,483,648

所以在你的情況x是0xDEADBEEF或3,735,928,559。 32位系統上的unsigned int可以存儲此值。但是,如果輸入爲signed,則會導致溢出,因此應用上述規則並將該值轉換爲-1,588,444,912。由於它是否定的,因此您在if聲明中的條件不滿足,因此您的聲明不會被打印。