大整数隐式截断为无符号类型

Large integer implicitly truncated to unsigned type

我试图确定位域中的最大可能值,我所做的是:

using namespace std;

struct A{
    unsigned int a:1;
    unsigned int b:3;
};

int main()
{
   A aa;
   aa.b = ~0U;
   return 0;
}

MSVC 没问题,但 GCC 4.9.2 给了我一个警告:

warning: large integer implicitly truncated to unsigned type [-Woverflow]  

想知道如何摆脱它(假设我不知道该字段的位宽,我想知道它的最大可能值是多少)。

您可以尝试按以下方式解决此问题

aa.b = 1;
aa.b = -aa.b;

请注意,bit-fields 的 value-representation 方面,包括它们的范围,目前在语言标准中未指定,这被认为是 C++ 标准中的一个缺陷。这很奇怪,特别是考虑到文档的其他部分(例如枚举类型的规范)试图依赖 bit-fields 的可表示值范围来达到他们自己的目的。这应该是 taken care of in the future.