大小小于int的位域是否应该进行整型提升?

Should bit-fields less than int in size be the subject of integral promotion?

本文关键字:整型 小于 小小 int 是否 位域      更新时间:2023-10-16

假设我有以下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是正确的,ab应该提升为int