c++ - 使用位移位来缩短 2 个字符会导致值很大的奇怪结果

标签 c++ char bit-shift short

我有一个 std::string ,其中包含服务器的响应。稍微解析一下字符串后,我发现了一个短路。短字节是大端字节序,并相应地存储在字符串中:

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

关于c++ - 使用位移位来缩短 2 个字符会导致值很大的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24619604/

相关文章:

Javascript 位移位-数字换行?

c++ - 以下代码如何在 C/C++ 中编译?

c - 使用 char 从 MAC 地址输出 PIN

c# - 为什么算术移位只在某些事件中将数字减半?

c++ - 结构中的默认值(字符)

c - 为什么打印出 char 指针会产生整个数组而不是指针的内存地址?

javascript - 在javascript中反向按位移位

c++ - 如何将字符串的所有单词写入不同的变量?

c++ - 如何解决 Eclipse CDT 中 C++ 文件中的 "Unresolved inclusion: <iostream>"?

c++ - Matlab三角函数