我想将浮点用户输入转换为等效的整数。我可以通过接受一个输入字符串来做到这一点,比如说“-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
这很容易但很笨拙。有一个更好的方法吗?也许我会做某种类型的铸造?
答案 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)))