2017-10-16 70 views
-2

signedとunsignedを比較すると、コンパイラは符号付きの値をunsignedに変換し、shortをintと比較するとコンパイラはより小さな型をより大きな型に変換します。しかし、このコードを書いて、signed int x = 0xdeadbeefとunsigned short y = 0xffffを比較した後、unsigned shortをintに変換した後、xの符号なしの値よりも小さい比較でyに0x0000ffffを置く必要があります。しかし、私のコードは、xがyより大きいif条件には入りません。誰かがなぜ私に説明することができますか?符号付きintとunsigned shortをC++で比較しました

コードスニペット:

"Xの方が大きい" という印刷されないコードを実行
#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; 
} 

+0

(符号付き)xが負であるためです。 – cleblanc

+0

しかし、署名されていない署名と比較すると、コンパイラはそれを符号なしに変換してはいけませんか? –

+0

btwあなたのコードは** C++ ** –

答えて

0

xを符号なしから符号付きに型変換すると、整数オーバーフローが発生します。 signed intは、unsigned intよりも小さな正の値を保持できます。したがって、整数のオーバーフローが発生すると、ほとんどのプラットフォームで、車の走行距離計のように動作します。つまり、int値が格納できる最大値を超えたら、最初からint値が始まります。 32ビットシステム(int32)で符号付きintの場合の 'beginning'は-2,147,483,648になります。

あなたのケースでは、xは0xDEADBEEFまたは3,735,928,559です。 32ビットシステム上の符号なしintはこの値を格納できます。しかし、それがsignedに型キャストされると、オーバーフローが発生し、上記のルールが適用され、その値が-1,588,444,912に変換されます。それは負の値なので、ifステートメントの条件は満たされないため、ステートメントは決して印刷されません。

関連する問題