我最近编写了一个代码块,用来输入用户的8位十六进制数,将其转换为整数,然后将其转换为浮点数。要从整数到浮点数,我使用以下内容:
int myInt;
float myFloat;
myFloat = *(float *)&myInt;
printf("%g", myFloat);
它适用于小数字。但是当用户输入十六进制数字时,例如:
0x0000ffff
0x7eeeeeef
我得到myInt = -2147483648,myFloat = -0。我知道我为myInt获得的数字是可以存储在C中的int变量中的最小数字。
由于这个问题,我程序的输入范围非常有限。有没有人对如何扩展我的代码范围有任何建议,以便它可以处理一个大到的数字:
0xffffffff
非常感谢你给我的任何帮助!
答案 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
。