C++ 常量整数提升规则?

C++ 常量整数提升规则?,c++,c++11,C++,C++11,为了提供一点背景知识(与下面的问题无关),在C++11中,我注意到一个缩小的问题: int foo[] = { 0xFFFFFFFF }; 编译(缩小转换)失败,因为0xFFFFFFFF是一个无符号int。然而,我也见过0xFF被签名的情况 我已经看过整数提升规则,但这主要是在左值的上下文中,而不是右值/常量。编译器如何确定常量的类型(没有文字后缀)?是否有文档或一个漂亮的小表格/备忘单显示了这方面的规则?我甚至不太确定它叫什么,否则我会尝试自己在C++11标准中找到它 预先感谢。 < P>

为了提供一点背景知识(与下面的问题无关),在C++11中,我注意到一个缩小的问题:

int foo[] = { 0xFFFFFFFF };
编译(缩小转换)失败,因为
0xFFFFFFFF
是一个
无符号int
。然而,我也见过
0xFF
被签名的情况

我已经看过整数提升规则,但这主要是在左值的上下文中,而不是右值/常量。编译器如何确定常量的类型(没有文字后缀)?是否有文档或一个漂亮的小表格/备忘单显示了这方面的规则?我甚至不太确定它叫什么,否则我会尝试自己在C++11标准中找到它


预先感谢。

< P> C++中被称为整数常量的C++称为整型文字。用于确定整型文字类型的规则在
2.14.2
integer literals表
6
一节中介绍,其中说明:

整型文字的类型是对应列表的第一个 在表6中,可表示其值

对于不带后缀的八进制或十六进制常数,表的顺序如下:

因此
0xFF
可以表示为int,而可以表示
0xffffff
的第一个类型将是无符号int

十进制常数的顺序如下所示:

正如我们可以看到的,十六进制和八进制文字的行为不同,我们可以看到。关于这一点,政府说了以下几点:

与十进制常量不同,八进制和十六进制常量太大,无法使用 be int如果在该类型的范围内,则被类型化为无符号int,因为 它们更可能表示位模式或掩码,这是 通常最好将其视为无符号数字,而不是“实数”


还引用了文本小节类型中的表
6

标准中有一个表,可在cppreference.com上复制:

特别是,不带后缀的十六进制或八进制整数文字被视为具有以下列表中的第一种类型,其中可以表示其值:

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

0xffffff
对于
int
来说太大,如果
int
的长度为32位,则选择
无符号int
。但是
0xFF
适合
int
,所以
int
就是这样。

0xFF
从来都不是负数。这是另一种书写
255
的方法。(它的类型为
int


0xFFFFFFFF
是一个大的正数。[lex.icon]下有一个表,指定整型常量的类型。对于不带后缀的十六进制常量,它是以下列表中可以容纳该大正数的第一种类型:
int
unsigned int
long int
unsigned long int
unsigned long int
。该实现可能会在此列表中添加自定义类型。

这是所需的最窄类型,具有签名优先级,最小值为
int
。我在我的回答中添加了一些额外的细节,您可能会发现这些细节很有用/有趣。因此,可以肯定地说,它关注的是整数范围,而不是具体的位深度。如果是这样的话,这有助于让事情变得非常清楚。@RobertDailey是的,是的,它并不直接依赖于位数,尽管它显然是间接的。+1用于引用标准并告诉我这个概念的名称。基本上,如果你想使用有符号整数,你应该只使用
intfoo[]={-1}
int
long int
long long int
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int