大小小于int的位域是否应该进行整型提升?
Should bit-fields less than int in size be the subject of integral promotion?
假设我有以下struct
:
struct A
{
unsigned int a : 1;
unsigned int b : 1;
};
我感兴趣的是表达式a + b
的类型。虽然技术上位字段的"类型"小于int
,所以积分提升可能会发生,然后结果是int
,就像在gcc和clang中一样。
但是由于不可能提取位域本身的确切类型,并且它总是被推断为它的"大"类型(即在这种情况下unsigned int
),积分提升应该发生吗?因为我们实际上不能讨论位字段的确切类型和它们的大小,除非它们被推断为unsigned int
,在这种情况下,不应该发生积分提升。
(我的问题再次源于MSVC碰巧认为unsigned int
是这种表达式的类型)
如果我们去看c++标准草案:N4140章节5
,它说:
期望操作数为算术或的许多二元操作符枚举类型导致转换并产生类似的结果类型道路目的是产生一种共同的类型,这也是类型结果。这种模式被称为通常的算术转换,它们的定义如下
和下面的项目符号适用:
- 否则,必须对两个操作数进行积分提升(4.5)那么,对于晋升人员,应遵循以下规则操作数:
和4.5节,其中说(强调mine):
整型位域(9.6)的右值可以转换为A如果int可以表示的所有值,则类型为int的prvaluebit-field;,如果为unsigned,则可转换为unsigned intInt可以表示位域的所有值。如果位域是更大的是,没有积分促销适用于它。如果位域有作为枚举类型,它被视为该类型的任何其他值促销目的。
所以gcc和clang是正确的,a
和b
应该提升为int
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 将整型常量映射到类型
- 将元组和整型实例合并到引用元组中
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 将最小值整数转换为无符号长整型
- 如何将小端格式的QByteArray转换为无符号长整型
- 直接初始化无符号短整型的标准行为
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 无符号和有符号短整型的位宽
- 将整型转换为浮点型时检测溢出
- 环礁和(长整型)的区别?
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?
- 将逗号格式化为长整型整数
- 大小小于int的位域是否应该进行整型提升?