ここにいくつかのコードがあります:
#include <stdio.h>
int main ()
{
char foo = 0xE7;
if (foo == 0xE7)
printf ("true\n");
else
printf ("false\n");
return 0;
}
それは「false」を出力します。foo には 0xE7 が含まれており、これは現在符号付き (-25) と見なされ、false を 0xE7 (10 進数で 231) と比較すると信じられるため、私はそれについてあまり心配していません。
しかし、これはどうですか?
#include <stdio.h>
int main ()
{
char c = 0xE7;
if (c == 0xFFFFFFE7)
printf ("true\n");
else
printf ("false\n");
return 0;
}
それは「真」を出力します。
C++ 標準によると、次のようになります。
16 進数の整数リテラル (基数 16) は 0x または 0X で始まり、一連の 16 進数で構成されます。これには、10 進数の数字と、10 から 15 の 10 から 15 までの文字 a から f および A から F が含まれます。
と:
整数リテラルの型は、その値を表すことができる表 6 の対応するリストの最初のものです。
リストの最初の項目は「int」です。比較が真であるため、0xFFFFFFE7 == -25 と表示されます。
ただし、0xFFFFFFE7 は 4294967271 の別の書き方です。
#include <stdio.h>
int main ()
{
char c = 0xE7;
if (c == 4294967271)
printf ("true\n");
else
printf ("false\n");
return 0;
}
それは「false」を出力します。したがって、0xFFFFFFE7 は 4294967271 と同じではありません。
標準に戻ると、「その値を表すことができる」という言葉は、実際には何を意味するのでしょうか? 明らかに、0xFFFFFFE7 を 4 バイトの signed int に詰め込むことができますが、それは実際には「値を表す」4294967271 ではありません。
でも:
if (0xFFFFFFE7 == 4294967271) // --> prints "true"
また:
if (-25 == 0xFFFFFFE7) // --> prints "true"
したがって、「その値を表すことができる」とは、「16 進数の定数を同等の 10 進数として扱う」のではなく、「2 進数レベルで」という意味のようです。これは正しいと思いますか?
gcc 4.8.2、Ubuntu 14.04、64 ビット プロセッサでテスト済み。