阅读 Stanley Lippman 的“C++ Primer”,我了解到默认情况下十进制整数文字是带符号的(最小类型的
int
、long
或 long long
适合文字的值),而八进制和十六进制文字可以是带符号的或无符号(文字值适合的最小类型 int
、unsigned int
、long
、unsigned long
、long long
或 unsigned long long
)。
以不同方式对待这些文字的原因是什么?
编辑:我试图提供一些背景
int main()
{
auto dec = 4294967295;
auto hex = 0xFFFFFFFF;
return 0;
}
在 Visual Studio 中调试以下代码显示
dec
的类型为 unsigned long
并且 hex
的类型为 unsigned int
。C++.2011 更改了 C++.2003 的升级规则。此更改记录在 §C.2.1 [diff.cpp03.lex] 中:
2.14.2
更改:整数文字类型
基本原理:C99 兼容性
C 标准(C.1999 和 C.2011)定义了第 6.4.4.1 节中的转换。 (C++.2011 §2.14.2 实质上复制了 C 标准的内容。)
整型常量的类型是其值可以在其对应列表中的第一个 被代表。
C.1999 的基本原理给出了以下解释:
C90 规则,十进制整数常量的默认类型是
、int
或long
,取决于哪种类型足够大以容纳该值而不溢出, 简化了常量的使用。C99中的选择是unsigned long
、int
和long
。 C89 添加后缀long long
和U
来指定无符号数。 C99 添加u
来指定LL
。long long
与十进制常量不同,八进制和十六进制常量太大而无法
的类型为int
如果在该类型的范围内,因为更有可能表示位 模式或掩码,通常最好将其视为无符号数字,而不是“真实”数字。unsigned int