I.D*_*.D. 7 c++ enums bit-fields c++11
这仅适用于C++ 11:
如果我有一个常规的枚举如下:
enum TestType
{
Test0 = 0,
Test1,
Test2,
Test3,
Test4,
Test5,
Test6,
Test7
}
Run Code Online (Sandbox Code Playgroud)
和这样的压缩结构:
struct
{
TestType a : 3
uint32_t b : 5
} TestStruct;
Run Code Online (Sandbox Code Playgroud)
为TestStruct.a保证访问时等于任何有效的分配枚举值?或者编译器是否有可能分配已签名的基础类型,然后将位域a视为范围-4到3.
\n\n\n保证
\nTestStruct.a等于其指定的枚举值吗?
不,您默认初始化TestStruct。如果这是在全局空间中,那么它将被初始化为零,并且a和b都将为 0。
如果这是在块空间中,则不会发生初始化,这意味着a和b具有未指定的值。您所知道的是该值将在该类型的可表示范围内。 Test0具有 的值0在这里根本不起作用。
如果你有
\n\nTestStruct{};\nRun Code Online (Sandbox Code Playgroud)\n\n然后a和b将为零,因为您正在对对象进行值初始化,在这种情况下,这意味着您将其初始化为零。你也可以使用
TestStruct{value1, value2};\nRun Code Online (Sandbox Code Playgroud)\n\na为和指定特定值b。
a对于是否可以存储所有值的问题,TestType我们必须查看[class.bit]/4,其中指出
\n\n\n[...]如果枚举数的值存储到相同枚举类型的位字段中,并且位字段中的位数足够大以容纳该枚举类型的所有值([dcl.enum ]),原始枚举器值和位字段的值应相等。
\n
强调我的
\n\n枚举的值由[dcl.enum]/8定义为
\n\n\n\n\n对于基础类型固定的枚举,枚举的值是基础类型的值。否则,对于 e min是最小枚举数且 e max \n 是最大枚举数的枚举,枚举的值是 \nb min到 b max范围内的值,定义如下:对于两个数,设 K 为 1补码表示以及
\n0一个补码或符号数值表示。b max是大于或等于 max(|e min \xe2\x88\x92 K, |e max |) 且等于 2 M \xe2\x88\x921 的最小值,其中 M 是非负整数。如果 e min非负,则b min为零,否则 \xe2\x88\x92(b max +K) 。如果 b min为零,则足以容纳枚举类型的所有值的最小位字段的大小为 max(M,1),否则为 M+1。可以定义一个具有未由任何枚举器定义的值的枚举。如果枚举器列表为空,则枚举的值就好像该枚举有一个值为 0 的枚举器
因此,在这种情况下,e min为 0,e max为7,因此 b min为 0,b max等于或大于 max(|e min | \xe2\x88\x92 K, |e max |),即 7。它必须等于 2 M \xe2\x88\x921 如果我们使用 3 作为 M,那么我们也会得到 7。
\n\n我们有
\n\n\n\n\n如果 b min为零,则足以容纳枚举类型的所有值的最小位字段的大小为 max(M,1),否则为 M+1。
\n
b min为零,因此我们需要的最小位域是 3,因此您可以保证 的所有值都TestType适合a。
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |