You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++代码中<<8 <<16 <<24操作读取32位二进制文件的作用?

代码核心逻辑

这段代码的作用是从二进制文件中逐个读取32位有符号整数(int32_t),并将读取到的数值存入容器v中,本质是手动把文件里的4个单字节数据拼接成完整的32位整数。

左移操作的作用

计算机存储多字节整数时,字节是按固定顺序排列的,这段代码采用的是小端序(低字节存在文件的靠前位置):

  • is.get()每次读取1个字节(8位),返回值范围是0-255的无符号值,赋值给int32_t后会自动转换为有符号类型。
  • 第一个读取的字节是整数的最低8位,直接加到num中,对应二进制的第0-7位。
  • 第二个读取的字节是次低8位,左移8位后,会被放到二进制的第8-15位,再和num相加,完成这部分的拼接。
  • 第三个字节左移16位,对应二进制的第16-23位;第四个字节左移24位,对应二进制的最高位区间(24-31位)。

举个实际例子:如果文件中存储的4个字节是0x6E 0xFF 0xFF 0xFF(对应十进制110、255、255、255),拼接后得到的数值是:
0xFF <<24 + 0xFF<<16 + 0xFF<<8 + 0x6E = 0xFFFFFF6E,也就是int32_t类型的-98,正好对应你提到的负数场景。

负数的处理逻辑

int32_t是32位有符号整数,它的最高位(第31位)是符号位:

  • 当第四个字节(左移24位的那个)的最高位为1时,整个拼接后的数值就是负数。
  • 由于int32_t采用补码存储,只要文件中的4个字节是该负数的补码形式,代码的拼接逻辑会自动保留符号位,最终得到正确的负数结果。

循环终止逻辑

每次读取4个字节后,!is会检查文件流的状态:如果读到文件末尾,或者读取出错,文件流的状态会变为false,此时跳出循环,避免拼接不完整的字节数据。

内容的提问来源于stack exchange,提问作者Silviam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:08:12