4
char byte = 0x80
if(byte == 0x80)
{
    cout << "This message never gets printed!";
}

16 進数値0x80は 2 進数で に相当し1000 0000、明らかに 1 バイトに収まります。

ただし、コンパイラは条件付きの行について警告します。

warning: comparison is always false due to limited range of data type

この場合、条件の結果が false になるのはなぜですか?

0x80条件付きで次のように展開されています0x80000000か?

==演算子を使用して acharが等しいかどうかを確認することは可能です0x80か?

4

2 に答える 2

0

signed charタイプには合計 256 個の値を0x7f含めることができます。最大値は であるため、タイプには値を-0x80含めるunsigned charことができます。使用している型の実装は型のようです。0x800xffcharsigned char

a に代入0x80すると、signed char強制的に値がオーバーフローし、値が になります-0x80signed charタイプ0x80は常に として解釈されるため、システムに表すことはできません-0x80。これは、最上位ビットが符号ビットとして使用されるためです。

ビット単位の and: を使用すると、比較が成功する可能性がありますbyte & 0x80。この操作の結果は、最上位ビットが設定されているかどうかだけで、どちらの方向も等しいことを意味しないことに注意してください。

于 2013-07-24T20:55:51.040 に答える