【发布时间】:2018-08-28 18:05:46
【问题描述】:
这仅适用于 C++11:
如果我有一个像下面这样的常规枚举:
enum TestType
{
Test0 = 0,
Test1,
Test2,
Test3,
Test4,
Test5,
Test6,
Test7
}
还有一个这样的打包结构:
struct
{
TestType a : 3
uint32_t b : 5
} TestStruct;
TestStruct.a 在访问时是否保证等于任何有效的分配枚举值?或者编译器是否有可能分配一个有符号的底层类型,然后将位域a 视为-4到3。
【问题讨论】:
-
"... 分配了枚举值?..." 什么值,
TestStruct尚未初始化.. -
你可以拥有的最小基础类型是 (u)int8_t 所以我认为它不会改变任何东西,因为你的值是从 0 到 7。你不能有 -4,3 的范围,因为枚举的基础类型不受位域的影响。
-
来自 cppreference on BitFields "无论是 char、short、int、long 和 long long 位字段,未显式签名或未签名的位字段是有符号的还是无符号的。例如,int b:3; 可能有值的范围 0..7 或 -4..3。” 因此,如果编译器选择底层类型为 int8_t,则位域可能只包含 -4 到 3 之间的值,这将导致Test4及以上要溢出?
标签: c++ c++11 enums bit-fields