常量整数提升规则?

voi*_*ter 9 c++ c++11

为了给出一些背景(与之后的问题无关),在C++ 11中,我注意到一个缩小的问题:

int foo[] = { 0xFFFFFFFF };
Run Code Online (Sandbox Code Playgroud)

这是无法编译(缩小转换)因为0xFFFFFFFFunsigned int.但是,我见过0xFF签名的案例.

我查看了整数提升规则,但这主要是在左值而不是右值/常量的上下文中.编译器如何确定常量类型(没有文字后缀)?是否有文件或一个漂亮的小桌/"备忘单",显示了这个规则?我甚至不确定这是什么,否则我试图在C++ 11标准中找到它.

提前致谢.

Bri*_*ian 12

标准中有一个表格,可在cppreference.com上复制:http://en.cppreference.com/w/cpp/language/integer_literal

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

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
Run Code Online (Sandbox Code Playgroud)

0xFFFFFFFFint如果int是32位长则太大了,所以unsigned int选择它.但是,它0xFF适合舒适地融入其中.intint


Sha*_*our 6

所谓被称作整数常数在C被称为整数常量在C++中.用于确定整数文字类型的规则在C++标准部分的2.14.2 Integer文字表中有所6说明:

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

对于没有后缀的八进制或十六进制常量,表具有以下顺序:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
Run Code Online (Sandbox Code Playgroud)

因此0xFF可以表示为int,而可以表示的第一个类型0xFFFFFFFFunsigned int.

十进制常量的顺序如下:

int
long int
long long int
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的十六进制和八进制文字行为不同,我们可以看到C99具有相同的表.国际标准程序设计语言的基本原理-C如下:

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

cppreference整数文字部分还引用表6的类型字面的子部分.

  • +1引用标准,并告诉我这个概念的名称. (3认同)