float和int之间的转换,字节表示?

时间:2012-07-10 17:45:48

标签: c

我有一个问题涉及计算机系统中float和byte之间的表示差异。那么例如float如何从float转换为int和back;它导致字节的完全不同的表示。我有什么资源可以指引我朝着正确的方向前进吗?任何帮助深表感谢!我在网上找不到任何东西,正确方向的链接会非常有用!

4 个答案:

答案 0 :(得分:4)

最常见的浮点数编码使用IEEE 754.对于单精度数,有一个符号位,8个指数位(e)和23个小数位(f)。

对于s,e和f的大多数值,表示的值为-1 s •2 e-127 •F,其中F是您得到的数字通过写入“1.”后跟23位f,然后将该字符串解释为二进制数字。例如,如果f是10000000000000000000000,那么二进制数字是1.10000000000000000000000,这是(十进制)1.5,所以F是1.5。

只要0 <0,则上述情况成立。 e&lt; 255.值0和255是特殊的。

当e为0时,除了以“0”而不是“1”开始F之外,表示的值与上述相同。特别是,如果f为零,则表示的值为零。如果f不为零,则将它们称为非正规数,因为它们小于上述主要方式中表示的正常值。

当e为255且f为0时,根据符号位s,表示的值为+ infinity或-infinity。当e为255且f不为零时,表示的值称为NaN,而不是数字,用于调试或捕获错误或其他特殊用途。有安静的NaN(不会导致陷阱;它们通常用于你想继续计算以获得最终结果,然后弄清楚如何处理NaN)和信号NaNs(它确实会导致陷阱;它们通常被使用当你想因为发生错误而中止计算时。)

编码在不同平台上的显示方式可能存在差异,尤其是32位内的字节排序。有些平台不使用IEEE 754编码。

双精度编码使用相同的方案,除了e是11位,127(称为指数偏差)变为1023,f是52位。指数的特殊值是它的最大值11位,即2047,而不是最大值的8位,255。

答案 1 :(得分:0)

C标准未指定浮点值的表示方式。每个实现/平台都可以自由地实现浮点数,但是他们认为合适。实现必须遵守某些约束,但位级表示是实现定义的。

由于您无法预测浮点数的存储或表示方式,因此没有真正的方法来回答这个问题。如果您考虑到特定的浮点实现,我们可能会提供一些细节。但是,这些细节只与具体实施有关。另请注意,不同的CPU架构可能会以不同方式转换值,即使它们使用相同的浮点表示。

答案 2 :(得分:0)

在一般情况下,将浮点值视为“精确”是危险的。一旦你有一个分数,浮动可能是近似的。 (如果分数可以用二进制精确表示,它可能仍然是精确的,例如1/2。但是例如,1/10将是近似值。)

有几个人向你指出了维基百科的文章。阅读那些。基本上,浮点值是符号位,指数和尾数。如果浮点值为50.0,则浮点值看起来与50的整数表示形式不同。 (删除了原始的错误讨论;有关详细信息,请参阅注释。)

没有简单的方法将整数转换为浮点数,反之亦然。您的计算机的CPU具有内置指令,可以为您进行转换,或者您可以编写一个可以执行转换的程序,但这并不是一个简单的技巧。

编辑:编辑上面删除了我写了一些不正确的东西的部分。 @Eric Postpischil指出了我犯的主要错误:值50将被存储为小于1的幂的小数值,而不是我最初说的。那是一个愚蠢的错误,我道歉。他还指出,“尾数”部分在技术上是“有意义的”;我只是说我经常看到它被称为“尾数”,无论这是否正确。

我将重复一个重要的部分:没有简单的方法将整数转换为浮点数,反之亦然。

答案 3 :(得分:0)

特定平台上floatint的表示是严格定义的,并且在该平台上为C编译器所知。这意味着总有一个明确定义的算法可以将一个转换为另一个。实际上,当使用自然平台特定类型时,转换由CPU(FPU)在内部执行。 CPU有一个专用命令,可以将float数据从存储器读入内部CPU寄存器。然后,另一个命令可以将该数据作为int值写回内存。反之亦然。

例如,在x86平台上,float_value = int_value分配通常会转换为一系列CPU命令,如

fld int_value   ; read `int` value from `int_value` to the internal register
fst float_value ; save `float` value from the internal register to `float_value`

在转换硬件不能立即支持的算术数据类型时,C编译器必须在生成的代码中拼写出所有必要的转换步骤。有时可能需要支持语言甚至不支持的整数或浮点类型,在这种情况下,必须手动实现转换。