为什么文字的基数会影响其类型?

时间:2018-11-11 17:57:26

标签: c++ integer literals

十进制数 4294967295 等于十六进制的 0xFFFFFFFF ,因此我希望立即数具有相同的类型,而不管其表示的基数是什么

std::is_same<decltype(0xFFFFFFFF), decltype(4294967295)>::value; //evaluates false

在我的编译器上,decltype(0xFFFFFFFF)unsigned int,而decltype(4294967295)signed long

1 个答案:

答案 0 :(得分:5)

十六进制文字和十进制文字类型的确定与lex.icon table 7

不同
  

整数文字的类型是表7中相应列表的第一个,可以在其中表示其值。

当没有十进制文字的后缀时,列出的类型按顺序排列:

  

整数
  长整数
  long long int

对于十六进制,顺序为:

  

int
  unsigned int
  长整数
  无符号长整数
  long long int   无符号long long int

为什么存在这种差异?考虑到我们在C语言中也有这个,我们可以看一下C99 rationale document,它说:

  

与十进制常数不同,八进制和十六进制常数太大而不能被整数转换为   如果在该类型的范围内,则为unsigned int,因为它们更有可能表示位   图案或遮罩,通常最好将其视为无符号数字,而不是“实数”。