大佬教程收集整理的这篇文章主要介绍了c – 已签名的基础类型枚举的位域溢出,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有如下常规枚举:
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.
我们有
以上是大佬教程为你收集整理的c – 已签名的基础类型枚举的位域溢出全部内容,希望文章能够帮你解决c – 已签名的基础类型枚举的位域溢出所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。