我有:
(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/