使用比特移位缩短2个字符会导致具有大值的奇怪结果
2 chars to short using bit-shifting results in a weird result with large values
我有一个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
在较高字节中如果是什么原因导致观察到的结果。
相关文章:
- 尝试将字符串/字符转换为整数会产生意外结果
- 当我用"ñ"字符循环访问字符串时出现奇怪的结果
- 字符到int8_t转换会产生意想不到的结果?
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- 通过正则表达式拆分字符串会切断结果的第一个字母
- 如果一个字符,比如说"9",我减去"0",我在结果上使用 is 数字,我是真还是假
- 对于字符串中的每个字符都会给出错误的结果
- 尝试以随机字符(长读取)打印字符串返回结果
- 为什么我得到这个字符指针的不同结果?
- C++使用 std::get_time 解析 YYMMDD ISO 8601 日期字符串会得到意外结果
- Cout删除了(未签名的字符)指针,给了我意外的结果
- 在将数组与字符数组进行比较后需要帮助输出一次结果
- 我不明白为什么当我按位或短字符时得到这个结果
- C++:输出文件中ASCII字符计数频率的结果时出现的奇怪数字
- 为什么字符<<和字符>>中间结果 int
- 宽字符输出结果
- 如何使用SIMD比较两个字符向量并将结果存储为浮点值
- 使用 const 指针的 C 样式字符返回不正确的结果
- 类中的动态字符数组不会打印正确的结果
- XOR错误的结果,转义字符