十进制数4294967295等于十六进制0xFFFFFFFF,所以我希望一个文字具有相同的类型,不管它用什么基数表示,然而
std::is_same<decltype(0xFFFFFFFF), decltype(4294967295)>::value; //evaluates false
看来在我的编译器decltype(0xFFFFFFFF)
上是unsigned int
,而decltype(4294967295)
在signed long
。
十六进制文字和十进制文字类型的确定与lex.icon 表 7不同
整数文字的类型是表 7 中可以表示其值的相应列表中的第一个。
当十进制文字没有后缀时,列出的类型按顺序排列:
整数
long int
long long int
对于十六进制,按顺序排列的列表是:
int
unsigned int
long int
unsigned long int
long long int unsigned long long int
为什么会存在这种差异?考虑到我们在 C 中也有这个,我们可以查看C99 基本原理文档,它说:
与十进制常量不同,如果在该类型的范围内,八进制和十六进制常量如果在该类型的范围内,则被键入为 unsigned int,因为它们更有可能表示位模式或掩码,通常最好将其视为无符号,而不是“实数”数字。