0

我这里有一些代码:

#include <stdio.h>

int main ()
  {
  char foo = 0xE7;
  if (foo == 0xE7)
    printf ("true\n");
  else
    printf ("false\n");
  return 0;
  }

打印“假”。我不太担心,因为我可以相信 foo 包含 0xE7,它现在​​被认为是有符号的 (-25) 并将 false 与 0xE7 进行比较——十进制为 231。


但是这个呢?

#include <stdio.h>

int main ()
  {
  char c = 0xE7;
  if (c == 0xFFFFFFE7)
    printf ("true\n");
  else
    printf ("false\n");
  return 0;
  }

那打印“真实”。

根据 C++ 标准:

十六进制整数文字(以 16 为基数)以 0x 或 0X 开头,由一系列十六进制数字组成,其中包括十进制数字和字母 a 到 f 和 A​​ 到 F,十进制值到 15。

和:

整数文字的类型是表 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;
  }

打印“假”。因此,0xFFFFFFE7 与 4294967271 不同。

回到标准,“可以表示其价值”这句话的真正含义是什么?显然,您可以将 0xFFFFFFE7 填充到 4 字节有符号整数中,但这并不是真正“代表值”4294967271。

然而:

  if (0xFFFFFFE7 == 4294967271)  // --> prints "true"

还:

  if (-25 == 0xFFFFFFE7)  // --> prints "true"

所以看起来“它的值可以表示”意味着“在二进制级别”,而不是“将十六进制常量视为其等效的十进制数”。这听起来对吗?

在 gcc 4.8.2、Ubuntu 14.04、64 位处理器上测试。

4

0 回答 0