c – 将int32重新解释为float

前端之家收集整理的这篇文章主要介绍了c – 将int32重新解释为float前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要保存一个浮点值,它是一个整数值的复制内存.
在reinterpretedFloat函数中,我创建了一个样本整数并将内存复制到float变量.
当memcpy-ed float返回时,值就会发生变化.

这是示例代码.

  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. void printHex(const unsigned char* buff,int count)
  5. {
  6. printf("0X");
  7. for (int i = 0; i < count; ++i)
  8. {
  9. printf("\t%X",buff[i]);
  10. }
  11. printf("\n");
  12. }
  13.  
  14. float reinterpretedFloat()
  15. {
  16. int32_t value = 0x7F845E58;
  17. float tmp;
  18. memcpy(&tmp,&value,sizeof(float));
  19. printHex(reinterpret_cast<const unsigned char*>(&tmp),4); //memcpy
  20. return tmp;
  21. }
  22.  
  23. int main()
  24. {
  25. float newFloat = reinterpretedFloat();
  26. printHex(reinterpret_cast<const unsigned char*>(&newFloat),4); //returned value
  27.  
  28. return 0;
  29. }

结果就是这样.

  1. 0X 58 5E 84 7F(memcpy)
  2. 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&C++相关文章