c++ - 意外的位移结果

标签 c++ c bit-manipulation

我有:

(gdb) display/t raw_data[4]<<8
24: /t raw_data[4]<<8 = 1111100000000
(gdb) display/t raw_data[5]
25: /t raw_data[5] = 11100111
(gdb) display/t (raw_data[4]<<8)|raw_data[5]
26: /t (raw_data[4]<<8)|raw_data[5] = 11111111111111111111111111100111

为什么第 26 行的结果不是 0001111111100111?谢谢。

编辑:更具体地说:

(gdb) display/t raw_data[5]
27: /t raw_data[5] = 11100111
(gdb) display/t 0|raw_data[5]
28: /t 0|raw_data[5] = 11111111111111111111111111100111

为什么第26行的结果不是11100111

最佳答案

您的数据类型是 char,在您的平台上似乎是有符号的。条目 raw_data[5] 包含负数 -25。

打印格式t 将数据打印为二进制的无符号整数。当您打印 raw_data[5] 时,它被转换为 unsigned char 213,但只有 8 位。当您对数据进行整数运算时,字符会提升为 32 位整数。

将负 char 值 -25 提升为带符号的 int 当然会产生 -25,但它作为 unsigned int 的表示现在是 2^^32 + x,而作为 unsigned int char 它是 2^^8 + x。这就是32位二进制数开头的所有位的来源。

使用未签名的原始数据可能更好。

关于c++ - 意外的位移结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24086735/

相关文章:

成员变量的C++类型名

我可以在不同的文件中定义 2 个相同类型的结构,我想将一个结构传递给另一个吗?

C/C++ 中的编译时位运算

php - 按位澄清

c++ - 如何实现具有循环引用的对象的深拷贝或克隆?

来自 Mysql DateTime 字符串的 C++ unix 时间

python - 从python方法cython访问python类中的c指针

C - 如何在排序时不更改 int 数组的值

c - 使用 union 来简化转换

c - C 中的移位运算符(<<、>>)是算术运算符还是逻辑运算符?