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
相关产品推荐
相关产品推荐

