在C中将大整数转换为浮点数

时间:2014-02-03 17:18:12

标签: c floating-point integer type-conversion ieee-754

我最近编写了一个代码块,用来输入用户的8位十六进制数,将其转换为整数,然后将其转换为浮点数。要从整数到浮点数,我使用以下内容:

int myInt;          
float myFloat;
myFloat = *(float *)&myInt;
printf("%g", myFloat);

它适用于小数字。但是当用户输入十六进制数字时,例如:

0x0000ffff
0x7eeeeeef

我得到myInt = -2147483648,myFloat = -0。我知道我为myInt获得的数字是可以存储在C中的int变量中的最小数字。

由于这个问题,我程序的输入范围非常有限。有没有人对如何扩展我的代码范围有任何建议,以便它可以处理一个大到的数字:

0xffffffff

非常感谢你给我的任何帮助!

2 个答案:

答案 0 :(得分:2)

获得与float一样准确传输的值的正确方法是:

float myFloat = myInt;

如果您想要更准确,请使用double代替float

您正在尝试重新解释int的位模式,就像它是float一样,这不是一个好主意。 C99及更高版本中提供了十六进制浮点常数和转换。 (但是,如果这是你正在尝试的,那么问题中的代码是正确的 - 你的问题似乎是将十六进制转换为整数。)

如果从0x0000FFFF(或从0x7EEEFFFF)获得-2147483648,则转换代码中存在错误。在做任何其他事情之前修复它。你是如何进行十六进制到整数转换的?使用strtol()可能是一种好方法(sscanf()  和朋友也是可能的),但要注意溢出。)

答案 1 :(得分:0)

  

有没有人对如何扩展我的代码范围有任何建议,以便它可以       处理与0xffffffff

一样大的数字

您不能将0xffffffff存储在32位int中;您可以存储在32位int中的最大正十六进制值是0x7FFFFFFF或(2 ^ 31 -1)或2147483647,但负范围是-2 ^ 31或-2147483648,

范围是由于可用位数和2的补码系统的明显限制。

如果你想要0xffffffff,请使用unsigned int