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

Chr*_*s_F 0 c++ integer literals

十进制数4294967295等于十六进制0xFFFFFFFF,所以我希望文字具有相同的类型,无论它表达的是什么基础,

std::is_same<decltype(0xFFFFFFFF), decltype(4294967295)>::value; //evaluates false
Run Code Online (Sandbox Code Playgroud)

似乎在我的编译器decltype(0xFFFFFFFF)unsigned int,decltype(4294967295)signed long.

Sha*_*our 5

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

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

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

integer
long int
long long int

对于十六进制,列表顺序为:

int
unsigned int
long int
unsigned long int
long long int unsigned long long int

为什么存在这种差异?考虑到我们在C中也有这个,我们可以查看C99基本原理文档,它说:

与十进制常量不同,如果在该类型的范围内,那么太大而不能成为整数的八进制和十六进制常量将被键入为unsigned int,因为它们更有可能表示位模式或掩码,通常最好将其视为无符号,而不是"真实" "数字.