【问题标题】:Converting a large integer to a floating point number in C在C中将大整数转换为浮点数
【发布时间】:2014-02-27 07:12:10
【问题描述】:

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

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

它非常适合小数字。但是当用户输入十六进制数字如:

0x0000ffff
0x7eeeeeef

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

因为这个问题,我的程序的输入范围极其有限。有没有人对我如何扩展我的代码范围有任何建议,以便它可以处理像这样大的数字:

0xffffffff

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

【问题讨论】:

  • intToFloat 中有什么内容?
  • 如果您想准确表示 32 位 int 的全部范围,那么您需要使用 double 而不是 float,因为 float 只有大约 23-24 位精度。
  • 对 intoToFloat 感到抱歉。我修改了我的变量名,这样它们就不会脱离上下文,但我忘了更改那个。
  • “将十六进制数转换为浮点单精度表示”是什么意思?您的意思是要将存储在整数中的位模式视为float?这大致就是您的代码目前所做的。如果这是你想要的,那么你主要需要整理你的整数转换代码;您应该能够从整数打印十六进制值并获得与输入相同的值,但如果您得到 0x80000000 (-2147483648) 作为输出,则您的转换是错误的。您使用的是哪个编译器,在哪个平台上?小心sizeof(int) == 2(不太可能)。

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


【解决方案1】:

有没有人对我如何扩展我的代码范围有什么建议? 处理和0xffffffff一样大的数字

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

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

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

【讨论】:

  • 我决定使用 strtol() 而不是我编写的将十六进制输入转换为整数的方法。现在我将 strtol() 给我的值存储在 uint32_t 中,但它仅适用于小于或等于 0x7effffff 的数字(这是一种改进,因为它仅适用于小于或等于 0x7eeeeeeee 的数字)。这是我能做到的,乔纳森?或者是否有可能进一步扩大范围?
【解决方案2】:

float 允许的范围内准确获取价值转移的正确方法是:

float myFloat = myInt;

如果您想要更高的准确性,请使用double 而不是float

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

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

【讨论】:

  • 这正是我想要做的(重新解释 int 的位模式,就好像它是一个浮点数)。要从十六进制转换为整数,我只需遍历从用户收到的十六进制数,然后将每个数字乘以 16 的幂,从最右边的 16^0 开始,以 16^7 结束。我在循环执行时添加每个结果,并以一个整数结束。
  • 好的。如果您输入 0x0000FFFF 并从代码中获取 0x80000000,则您的转换代码有问题。这似乎是你在你的问题中所说的。 (如果这不是你的意思,你需要澄清这个问题——澄清这就是你正在做的事情可能不是一个坏主意。)至少,你必须验证你正在得到十六进制转换代码中的正确值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2014-02-13
相关资源
最近更新 更多