c – 枚举类型的按位运算

在尝试通过以下代码将内存中的数据读入枚举时,我得到了这些奇怪的结果:

void read_memory (const unsigned, const unsigned, unsigned* const);

/* ... */

enum {DATA_0, DATA_1, DATA_2} data;
read_memory(base_addr, offset, &data);  //data = 0x0900
data >>= 8;  //data = 0x7e000000

我通过引入一个无符号类型的临时变量来解决这个问题.但我想确定理解为什么以前的方法不起作用.

首先,我知道标准不需要枚举类型的特定宽度,只要可以表示所有成员.事实上,6.7.2.2规定:

Each enumerated type shall be compatible with char, a signed integer type, or an
unsigned integer type.

但是,由于从内存中读取的原始数据符合char,我认为这应该不是问题.
此外,如果我理解正确,“兼容”意味着您可以像使用这种类型一样使用它.特别是,枚举类型的对象可以是按位移位运算符的操作数.
我也知道签名可能是一个问题,因为我们不知道枚举是否签名.但是,据我所知,0x0900似乎没有签名.

那问题出在哪里呢?

最佳答案 您的(在我看来,名称很糟糕)read_memory()函数读取了多少数据?如果这与sizeof数据的值不同,则表示存在问题.仅仅因为枚举值对于char来说足够小并不意味着编译器必须选择一个char;或许用于操纵整数数字的指令更快,和/或存在对齐问题.

点赞