使用十六进制常量进行整数提升

时间:2015-06-30 23:47:48

标签: c++ hex standards integer-promotion

我在这里有一些代码:

#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;
  }

打印“true”。

根据C ++标准:

  

十六进制整数文字(十六进制)以0x或0X开头,由一系列十六进制数字组成,包括十进制数字和字母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;
  }

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

回到标准,“它的价值可以代表”这几个词真的意味着什么?很明显,你可以将0xFFFFFFE7填充到4字节的signed int中,但这并不是真正“代表值”4294967271。

然而:

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

此外:

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

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

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

0 个答案:

没有答案