我有一个从套接字(小端)读取的字节流。
谁能告诉我为什么只有下面的最后一种方法才能给出正确的答案?
我怀疑这与进位有关,但不确定。我一直发现
以十六进制形式打印二进制数据。
例如
printf("%02X", data);
有时会在前面打印出带有0xff的有趣值。解决它的方法似乎
做这个。当数据也是char数据类型时,仍然偶尔会发生这种情况:
printf("%02X", data & 0xff);
这是我从字节流中看到的简化示例。
字节是我从套接字读取的字节流。
int main(int argc, char* argv[])
{
union {
unsigned int num;
char bytes[4];
} x;
x.num = 500;
printf("x.num=%u\n", x.num);
unsigned int method1 = x.bytes[0] | (x.bytes[1] << 8) | (x.bytes[2] << 16) | (x.bytes[3] << 24);
printf("method1 = %u\n", method1);
unsigned int method2 = x.bytes[0] + (x.bytes[1] << 8) + (x.bytes[2] << 16) + (x.bytes[3] << 24);
printf("method2 = %u\n", method2);
unsigned int method3 = (x.bytes[0] & 0xff | (x.bytes[1] & 0xff) << 8
| (x.bytes[2] & 0xff) << 16 | (x.bytes[3] & 0xff) << 24);
printf("method3 = %u\n", method3);
return 0;
}
哪个输出:
x.num=500
method1 = 4294967284
method2 = 244
method3 = 500
实际上只有最后一个摘录是正确的。
我建立数字的方法是否最优化?我也尝试将
memcpy
设置为变量,但这又是不可靠的。 最佳答案
将带符号的数据类型转换为更高的数据类型时,最高有效位用作符号位。您的工会中应该有unsigned char
。在您的情况下,500 = 256 + 244 = 0x1f4,并且字节244设置了最高有效位,因此提升时变为0xfffffff4。