C++中复制浮点数字节模式后读取结果错误是什么原因?
问题核心原因
你出现这个问题的本质是类型转换的执行逻辑和你预想的完全不同,并不是字节复制出了问题:
- 你代码里写的
(int)*cp/(float)*cp,实际执行顺序是:- 先对
char*类型的cp执行解引用操作*cp,得到的是cp指向的第一个字节的char类型值,仅占1字节 - 再把这个1字节的
char值转换为int/float类型,自始至终都没有读取你复制的4个字节的完整内容
- 先对
为什么int场景下你误以为结果正确
这是小端字节序下的巧合:
32位int类型的20的二进制表示为0x00000014,在主流小端架构的设备上,内存存储的字节顺序是低位在前,也就是4个字节依次为0x14、0x00、0x00、0x00。
你取第一个字节的char值就是0x14(对应十进制20),把这个值转成int当然得到20,让你误以为是读取了完整的4字节内容,实际上你只读到了第一个字节。
为什么float场景下输出为0
32位float类型的20遵循IEEE 754编码标准,二进制表示为0x41A00000,小端存储下4个字节依次为0x00、0x00、0xA0、0x41。
你取第一个字节的char值就是0x00(对应十进制0),把这个值转成float自然输出0。
正确的读取写法
如果你要让编译器把cp指向的4字节当作完整的int/float读取,需要先把char*转换为对应类型的指针再解引用:
// 读取完整int std::cout << *(int*)cp; // 读取完整float std::cout << *(float*)cp;
注意:上述直接指针转换的写法不符合C严格别名规则,属于未定义行为,生产环境建议使用
memcpy或者C20提供的std::bit_cast完成位模式的转换,避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者MP3D
相关产品推荐
相关产品推荐

