阅读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
。
这与我读过的内容相矛盾但仍然存在:两个变量代表相同的值,但属于不同的类型。那令我困惑。
答案 0 :(得分:5)
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标准中的内容。)
整数常量的类型是其值可以在其中的第一个相应列表 代表。
<子> larger image 子>
C.1999基本原理给出了以下解释:
C90规则,十进制整数常量的默认类型为
int
,long
或unsigned long
,取决于哪个类型足够大以保持值而不溢出, 简化了常量的使用。 C99中的选项包括int
,long
和long long
。 C89添加了后缀U
和u
来指定无符号数字。 C99添加LL
以指定long long
。与十进制常量不同,八进制和十六进制常量太大而不能
int
s被输入为unsigned int
如果在该类型的范围内,因为 更有可能代表位 模式或面具,通常最好被视为无符号,而不是“真实”数字 。