【问题标题】:Should bit-fields less than int in size be the subject of integral promotion?大小小于 int 的位域应该是整体提升的主题吗?
【发布时间】:2015-09-11 17:31:52
【问题描述】:

假设我有关注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++ visual-studio-2015 language-lawyer bit-fields integer-promotion


【解决方案1】:

如果我们转到 draft C++ standard: N4140 部分 5 它会说:

许多二元运算符需要算术或 枚举类型导致转换并产生类似的结果类型 方式。目的是产生一个通用类型,这也是 结果。这种模式称为通常的算术转换, 定义如下

以下项目符号适用:

  • 否则,应在两个操作数上执行积分提升 (4.5)。61 然后应将以下规则应用于提升 操作数:

第 4.5 节说(强调我的):

整数位域 (9.6) 的纯右值可以转换为 类型 int 的纯右值如果 int 可以表示 bit-field; 否则,如果 unsigned 则可以转换为 unsigned int int 可以表示位域的所有值。如果位域是 更大的是,没有适用于它的整体促销。如果位域有 枚举类型,它被视为该类型的任何其他值 推广目的。

所以gcc和clang是正确的,ab应该提升为int。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 2022-08-04
    • 1970-01-01
    • 2016-08-30
    • 2020-09-06
    • 2016-04-16
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多