C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 已签名的基础类型枚举的位域溢出大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这仅适用于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.如果这是在全局空间中,那么它将被初始化为零,并且a和b都将为0.

如果这是在块空间中,则不会发生初始化,这意味着a和b具有未指定的值.所有你知道的是,该值将在该类型的可表示范围内.具有值0的Test0根本不起作用.

如果你有

TestStruct{};

然后a和b将为零,因为你是初始化对象的值,在这种情况下,这意味着你零初始化它.你也可以使用

TestStruct{value1,value2};

为a和b分配特定值.

关于是否可以存储TESTTYPE的所有值的问题,我们必须查看[class.bit]/4的状态

强调我的

枚举的值由[dcl.enum]/8定义为

所以在这种情况下,emin为0,emax为7,所以bmin为0,bmax等于或大于max(| emin | – K,| emax |)为7.如果我们必须等于2M-1使用3表示M然后我们也得到7.

我们有

并且bmin为零所以我们需要的最小位域是3,所以你可以保证TESTTYPE的所有值都适合a.

大佬总结

以上是大佬教程为你收集整理的c – 已签名的基础类型枚举的位域溢出全部内容,希望文章能够帮你解决c – 已签名的基础类型枚举的位域溢出所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。