如果我想将float或double转换为整数类型,并且我不希望它在任何情况下溢出,我应该如何选择整数类型?
答案 0 :(得分:2)
floats
的范围几乎总是大于long long
或int64
(但可能取决于实施)。
例如,在.Net中,float
的范围是3.4E +/- 38
,但long long
和int64
的范围是 - 9,223,372,036,854,775,808
到{{1 }}。你无法确定你不会溢出。 C和C ++的其他实现具有相似的范围。
答案 1 :(得分:0)
有一种简单的方法可以将int转换为float和back。这是可能的,因为大多数现代计算机共享32位存储。这允许使用联合。例如:
union
{
float x;
int i;
} u;
在这里你可以自由地分配一个浮点u.x=391
,然后使用整数表示int myint = u.i
没有什么可以阻止与其他存储类一起使用。但是,您必须检查最重要的位并确保1 <= msb < 32
,否则您将失败。在double具有msb&lt; 32它接受了类似的治疗。
这不推荐使用,并且是最佳实现定义的行为。 ieee754格式的浮点数字存储定义了32位存储。它本身就是在整个其他讨论中。您可以测试此方法,查看ieee754存储格式并了解它们带来的限制。