gpt4 book ai didi

c++ - 意外的位移结果

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:49 26 4
gpt4 key购买 nike

我有:

(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com