作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在下面的代码中,一个枚举类型的变量被保存到一个位域中。据我了解,可以在不丢失数据的情况下检索变量。但是,这不起作用。
下面的输出是否符合标准?
#include<iostream>
using namespace std;
const int M=3, UL=(1<<M)-1; // range 0 .. 7, fits into 3 bits
enum class ec { e_min=0, e_max=UL};
// in [decl.enum] (8): b_min==0 && b_max==7==2^M-1
struct bitFieldType {
ec data : M; // 3 bits
};
int main(){
bitFieldType bf;
for (int c=0; c<=UL; ++c){;
ec enumIn { static_cast<ec>(c) }; // initialize enumeration type
bf.data = enumIn; // copy into bit-field
ec enumOut{bf.data}; // retrieve enumeration type from bit-field
cout<<static_cast<int>(enumIn) <<" "<< static_cast<int>(enumOut)
<< " " << (bf.data==enumIn) <<"\n";
}
}
[dcl.enum] (8): "最小位域的大小足以容纳如果 b min 为零,则枚举类型的所有值都是 max(M, 1) ...”[类.位] (4)"枚举器的值存储在相同的位字段中 枚举类型和位域中的位数足够大 保存该枚举类型(10.2)的所有值,原始 枚举值和位域的值 应该比较相等。”
如果是这样,为什么输出看起来像这样?
clang++ -Wall -fsanitize=undefined -pedantic -std=c++17 bitf.cpp && ./a.out
0 0 1
1 1 1
2 2 1
3 3 1
4 -4 0
5 -3 0
6 -2 0
7 -1 0
clang++ --version
clang version 9.0.0 (trunk 351995)
Target: x86_64-unknown-linux-gnu
编辑:添加了一个 static_cast<>() 以便代码编译时将“枚举类”替换为普通的“枚举”。
使用普通的“enum”而不是“enum class”,输出符合预期。此外,在位字段中增加一位,输出符合预期。
最佳答案
你的ec
,在范围内,有一个fixed underlying type of int
, 所以它的值为 all those of int
并且您的位域不够宽,无法保证任何事情。在实践中,它可能被解释为一个signed 位域,它需要宽度为 4 来存储值 4-7(即使 rule about signedness 没有明确定义一个符号的符号枚举类型为其基础类型)。
关于c++ - 在位域 [dcl.enum] [class.bit] 中保存枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55784913/
我是一名优秀的程序员,十分优秀!