使用比特移位缩短2个字符会导致具有大值的奇怪结果

2 chars to short using bit-shifting results in a weird result with large values

本文关键字:结果 字符 2个      更新时间:2023-10-16

我有一个std::字符串,它包含服务器的响应。在对字符串进行了一点分析之后,我发现了一个short。short是big-endian,并相应地存储在字符串中:

raw[0] == 0xa5;
raw[1] == 0x69;

我知道这是

file << raw[0] << std::endl << raw[1];

当被视为十六进制时,结果为"0xa5 0x0a 0x69"。

我把它们写成这样的短片,然后根据https://stackoverflow.com/a/300837/1318909:

short x = (raw[1] << 8) | raw[0];
file << std::to_string(x);

预期结果?27045(0x69a5(。

实际结果-91(0xffa5(<--溢流

为什么会这样?我进行了测试,结果显示它运行良好,值为2402。我还做了一些额外的测试,它与一起工作

short x = (raw[1] << 8) | 0xa5;

但没有

short x = (0x69 << 8) | raw[0];

char可能会(也可能不会(被签名,而且它看起来像是在您的平台上。这意味着0xa5在您之前或在高位字节中被符号扩展为0xffa5。

在进行位操作之前,请尝试将每个字节强制转换为unsigned char

raw[0]是类型为char的对象,在您的平台上恰好是8位有符号整数类型。当您将0xA5值填充到这样的签名char对象中时,它实际上获得了-91的值。当raw[0]用作|运算符的操作数时,它要经过常见的算术转换。后者将其转换为具有值-91的类型int的值(0xFFA5(。该FF在较高字节中如果是什么原因导致观察到的结果。