c – 将int32重新解释为float

c – 将int32重新解释为float,第1张

概述我需要保存一个浮点值,它是一个整数值的复制内存. 在reinterpretedFloat函数中,我创建了一个样本整数并将内存复制到float变量. 当memcpy-ed float返回时,值就会发生变化. 这是示例代码. #include <stdio.h>#include <stdint.h>void printHex(const unsigned char* buff, int coun 我需要保存一个浮点值,它是一个整数值的复制内存.
在reinterpretedfloat函数中,我创建了一个样本整数并将内存复制到float变量.
当memcpy-ed float返回时,值就会发生变化.

这是示例代码.

#include <stdio.h>#include <stdint.h>voID printHex(const unsigned char* buff,int count){    printf("0X");    for (int i = 0; i < count; ++i)    {        printf("\t%X",buff[i]);    }    printf("\n");}float reinterpretedfloat(){    int32_t value = 0x7F845E58;    float tmp;    memcpy(&tmp,&value,sizeof(float));    printHex(reinterpret_cast<const unsigned char*>(&tmp),4); //memcpy    return tmp;}int main(){    float newfloat = reinterpretedfloat();    printHex(reinterpret_cast<const unsigned char*>(&newfloat),4); //returned value    return 0;}

结果就是这样.

0X      58      5E      84      7F(memcpy)0X      58      5E      C4      7F(returned value)

我的预期是0X 58 5E 84 7F ……

任何机构都可以解释为什么会这样?
在x64配置中,这不会发生.

解决方法 0x7f845e58是 signaling NaN.它被归一化为0x7fc45e58,这是一个具有相同有效载荷的安静NaN.

x86-64和32位x86结果之间的区别是因为在前一种模式下,要从reinterpretedfloat()函数返回浮点值,来自SSE ISA扩展的MOVSS指令将值加载到xmm0寄存器中而不进行任何转换,而在后者使用FLD DWord […],它将32位浮点数转换为x87内部80位长双精度格式,将信号状态归一化为quIEt *.

机制上的差异是由于x86-64体系结构保证支持SSE,因此ABI使用它,而i386 ABI不需要它,因为并非所有x86 cpu都支持它.

*从技术上讲,转换会导致无效 *** 作异常,但由于它被屏蔽(默认情况下),因此您可以获得从NaN中删除信令状态的规范化结果

总结

以上是内存溢出为你收集整理的c – 将int32重新解释为float全部内容,希望文章能够帮你解决c – 将int32重新解释为float所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1241300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存