gpt4 book ai didi

c++ - 在位域 [dcl.enum] [class.bit] 中保存枚举类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:09 31 4
gpt4 key购买 nike

在下面的代码中,一个枚举类型的变量被保存到一个位域中。据我了解,可以在不丢失数据的情况下检索变量。但是,这不起作用。

下面的输出是否符合标准?

#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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com