为什么十进制和十六进制整数文字的处理方式不同?

问题描述 投票:0回答:1

阅读 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++ types integer constants literals
1个回答
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
的类型为
unsigned int
如果在该类型的范围内,因为更有可能表示位 模式或掩码,通常最好将其视为无符号数字,而不是“真实”数字

© www.soinside.com 2019 - 2024. All rights reserved.