The*_*CAL 1 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
Run Code Online (Sandbox Code Playgroud)
为什么第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
Run Code Online (Sandbox Code Playgroud)
为什么第26行的结果不是11100111?
您的数据类型是a char,在您的平台上似乎已签名.该条目raw_data[5]保留负数-25.
打印格式t将数据打印为二进制的无符号整数.打印时raw_data[5],它将转换为unsigned char 213,但只有8位.对数据执行整数运算时,字符将提升为32位整数.
当然,将负的char值-25提升为带符号的int将产生-25,但它现在表示为unsigned int 2^^32 + x,而作为unsigned char则是2^^8 + x.这就是32位二进制数开头的所有数据来自的地方.
使用未签名的原始数据可能更好.