0

ここにいくつかのコードがあります:

#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 ビット プロセッサでテスト済み。

4

0 に答える 0