在我之前的回答中,我正在向struct
投射char
,提取单个字节的数据,然后将值显式地转换为char
,然后分配给一个int。
代码清单
myStruct_t structToTest = { 16, 'A'};
myStruct_t referenceStruct;
memset(&referenceStruct, 0xFF, sizeof(myStruct_t));
int t1 = (char)(*(((char*)&structToTest)+i));
int t2 = (char)(*(((char*)&referenceStruct)+i));
printf("Byte #%02d - Test Struct:0x%02X - Reference Structs:0x%02X\n", i, t1, t2);
当我打印出来时,两个十六进制值中的一个按预期打印,但另一个似乎打印得比我想要的更多:
输出
Byte #00 - Test Struct:0x10 - Reference Struct:0xFFFFFFFF
Byte #01 - Test Struct:0x00 - Reference Struct:0xFFFFFFFF
Byte #02 - Test Struct:0x00 - Reference Struct:0xFFFFFFFF
Byte #03 - Test Struct:0x00 - Reference Struct:0xFFFFFFFF
Byte #04 - Test Struct:0x41 - Reference Struct:0xFFFFFFFF
Byte #05 - Test Struct:0x00 - Reference Struct:0xFFFFFFFF
Byte #06 - Test Struct:0x00 - Reference Struct:0xFFFFFFFF
Byte #07 - Test Struct:0x00 - Reference Struct:0xFFFFFFFF
如果我明确对0xFF
字面值执行逻辑 AND 操作,我会得到预期的输出:
代码清单
int t1 = (char)(*(((char*)&structToTest)+i)) & 0xFF;
int t2 = (char)(*(((char*)&referenceStruct)+i)) & 0xFF;
输出:
Byte #00 - Test Struct:0x10 - Reference Structs:0xFF
Byte #01 - Test Struct:0x00 - Reference Structs:0xFF
Byte #02 - Test Struct:0x00 - Reference Structs:0xFF
Byte #03 - Test Struct:0x00 - Reference Structs:0xFF
Byte #04 - Test Struct:0x41 - Reference Structs:0xFF
Byte #05 - Test Struct:0x00 - Reference Structs:0xFF
Byte #06 - Test Struct:0x00 - Reference Structs:0xFF
Byte #07 - Test Struct:0x00 - Reference Structs:0xFF
为什么我需要使用屏蔽操作?显然转换不会将数据截断为8位吗?
谢谢!
答案 0 :(得分:3)
是的,但是当您将签名的 char
投射到签名的 int
时,符号位会被扩展。因此,如果这就是你的意思,请使用无符号类型。
使用unsigned
类型通常比掩盖更好,因为它清楚地表达了您的意图。它也可能产生更高效的代码,尽管编译器可能会优化掉不必要的符号扩展和掩码操作。
由于您的数据是,我假设,实际上不是字符,而是简短的二进制代码,您可能应该使用uint8_t
。