我有一个从套接字(小端)读取的字节流。
谁能告诉我为什么只有下面的最后一种方法才能给出正确的答案?
我怀疑这与进位有关,但不确定。我一直发现
以十六进制形式打印二进制数据。

例如

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。

10-06 09:01