常量整数提升规则
Constant integer promotion rules?
为了提供一点背景(与下面的问题无关),在C++11中,我注意到了一个缩小范围的问题:
int foo[] = { 0xFFFFFFFF };
由于0xFFFFFFFF
是unsigned int
,因此无法编译(缩小转换范围)。但是,我看到过签署0xFF
的情况。
我已经研究了整数提升规则,但这主要是在左值的上下文中,而不是右值/常量。编译器如何确定常量的类型(没有文字后缀)?有没有文档或一个漂亮的小表格/"备忘单"来显示这方面的规则?我甚至不确定它叫什么,否则我会试图在C++11标准中自己找到它。
提前谢谢。
标准中有一个表,在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
如果int
是32位长,则0xFFFFFFFF
对于int
来说太大,因此选择unsigned int
。但是0xFF
很适合int
,所以int
是。
在C中被称为整数常量的东西在C++中被称作整数值。C++标准草案2.14.2
integer literals表6
中包含了用于确定integer literals类型的规则,其中表示:
整数文本的类型是相应列表的第一个在表6中可以表示其值。
对于没有后缀的八进制或十六进制常量,表的顺序如下:
int unsigned int long int unsigned long int long long int unsigned long long int
因此, 十进制常数的顺序如下: 正如我们所看到的,十六进制和八进制文字的行为不同,我们可以看到C99有相同的表。国际标准——程序设计语言——C的基本原理如下: 与十进制常量不同,八进制和十六进制常量太大,无法如果在该类型的范围内,则be-ints被类型化为无符号int,因为它们更有可能代表比特模式或掩码通常最好将其视为无符号数字,而不是"实数"。 cpppreference integer literal部分还在literal的类型子部分中引用表0xFF
可以表示为int,而第一个可以表示0xFFFFFFFF
的类型将是unsigned intint
long int
long long int
6
。
0xFF
从不为负数。这是255
的另一种书写方式。(其类型为int
)。
CCD_ 19是一个大的正数。[lex.icon]下有一个表,用于指定整数常量的类型。对于没有后缀的十六进制常量,它是以下列表中第一个可以容纳该大正数的类型:int
、unsigned int
、long int
、unsigned long int
、long long int
、unsigned long long int
。实现可能会将自定义类型添加到此列表中。
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 此代码是否违反一个定义规则
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 生成文件不对文件使用隐式规则
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 为什么此指针值不能转换为整数的规则是什么?
- 有没有办法让32位C 编译器遵循16位整数促销规则
- 是整数舍入规则决定了 C++、python3 和 python2.7 之间的 % 操作差异吗?
- C++整数转换规则
- 常量整数提升规则