我不知道如何将16字节十六进制转换为浮点数

时间:2015-06-28 06:54:53

标签: c

可能从我试图转换和漫游互联网的时间仅仅是为了回答这个问题,但我找不到。我只是通过一些严肃的编程或通过数学手动将十六进制转换为十进制。 我期待转换。如果有任何办法,请分享。好吧,我搜索并发现似乎没有工作的IEEE754,或者我不理解它。我可以通过任何等式手动完成,我想我听说过吗?或者是一个可以做到的整洁的C程序。

请帮忙!任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

您需要学习IEEE floating point spec

这在Java中非常简单。您有方便的方法,例如Float.floatToRawIntBits(float x)Float.intBitsToFloat(int x) 你可以用联盟做到这一点。

在C中它更加hacky。你可以滥用工会。 C中的联合对两个不同的变量重用相同的内存。像

这样的联盟
union DoubleLong {
  long l;
  double d;
} u;

允许您将同一位内存视为长u.i或双u.f。它们都有8个字节,所以它们占用相同的空间。因此,u.d = M_PI; printf("%lx\n", u.l);打印pi 0x400921fb54442d18的二进制表示。

对于16字节,我们需要union有一个数组或两个8字节长。

#include <stdio.h>

union Data {
  long i[2];
  long double f;
} u;

int main(int argc, char const *argv[]) {
  // Using random IP6 address 2602:306:cecd:7130:5421:a679:6d71:a660 
  // Store in two separate 8-byte longs
  u.i[0] = 0x2602306cecd7130;
  u.i[1] = 0x5421a6796d71a660;
  // Print out in hexidecimal
  printf("%.15La %lx %lx\n", u.f,u.i[0],u.i[1]);
  // print out in decimal
  printf("%.15Le %ld %ld\n", u.f,u.i[0],u.i[1]);
  return 0;
}

一个问题是您的系统上可能未定义16字节十六进制浮点数。 float通常为32位 - 4字节,double为64位 - 8字节。有一个long double类型但在我的mac上只有80位--10字节。转换为两个双精度数可能更简单。所以在我的系统中,只有第二个数字的最后4个十六进制数字很重要。

并非所有十六进制数字都对应于有效的浮点数,很多值都与NaN相对应。如果较高的位是7FFF或FFFF(或7FF,FFF表示双倍),则会产生无穷大的NaN。