转换为(char)并分配给(int)不会清除MSB

时间:2014-08-06 18:01:25

标签: c casting printf

在我之前的回答中,我正在向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位吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

是的,但是当您将签名的 char投射到签名的 int时,符号位会被扩展。因此,如果这就是你的意思,请使用无符号类型。

使用unsigned类型通常比掩盖更好,因为它清楚地表达了您的意图。它也可能产生更高效的代码,尽管编译器可能会优化掉不必要的符号扩展和掩码操作。

由于您的数据是,我假设,实际上不是字符,而是简短的二进制代码,您可能应该使用uint8_t