将Float转换为整数等效

时间:2010-07-07 18:57:30

标签: c++ floating-point integer

我想将浮点用户输入转换为等效的整数。我可以通过接受一个输入字符串来做到这一点,比如说“-1.234”然后我可以显式地将每个字符转换为它的十进制表示。 (顺便说一下大端)。所以我只想说我给出的例子,

-1.234 = 1|01111111|00111011111001110110110

sign bit = 1 = 128<<31
exponent bits = 01111111 = 127<<23
mantissa bits = 00111011111001110110110 = 1962934
decimal equivalent = 1962934 + 127<<23 + 128<<31

这很容易但很笨拙。有一个更好的方法吗?也许我会做某种类型的铸造?

4 个答案:

答案 0 :(得分:7)

联盟允许您访问与不同类型相同的内存

union floatint
{
   float f;
   int i;
}

floatint fi;
fi.f=-1.234;
int i=fi.i;

警告:由于大小和调整,你可以进入奇怪的平台差异和类似的东西,但是因为你已经通过尝试将float解释为int来做出一些假设,你可能能够逃脱它。阅读更多关于工会的信息,我认为这就是你想要的。

答案 1 :(得分:3)

float a = -1.234;
int b = *(int*)&a;

此外,在C ++中,这个转换运算符不进行任何检查reinterpret_cast。这可能更好。

int b = *reinterpret_cast<int*>(&a);

答案 2 :(得分:1)

重新解释位模式的标准方法是使用memcpy。如果我没记错的话,gcc允许指针类型转换*(int*)&a作为扩展名,但标准不保证它,并且不适用于所有编译器。同样,工会也不能保证工作。

#include <stdio.h>
#include <string.h>

float f = -1.234;
int i;
memcpy(&i, &f, sizeof i);
printf("bit pattern is: %d\n", i);

通过优化,将从生成的机器代码中完全消除对memcpy的调用。

答案 3 :(得分:0)

如果您需要转换一个简单的值,而不需要额外的变量:

#define float_to_int(f) (*reinterpret_cast<const int*>(&static_cast<const float&>(f)))