谁能给我解释一下或链接一些有用的资源,以便理解Java方法Float.intBitsToFloat(int)
背后的算法?
Java使用IEEE 754浮点数。Float.intBitsToFloat(int)
通过解释其参数的32位来工作,就好像它们按照这里描述的格式指定了一个32位浮点数。
Double.longBitsToDouble(long)
适用于64位浮点数,如下所述。
在C中,你可能会达到同样的效果,像这样:
#include <stdint.h>
union int_float_bits {
int32_t int_bits;
float float_bits;
};
float intBitsToFloat(int32_t x)
{
union int_float_bits bits;
bits.int_bits = x;
return bits.float_bits;
}
(虽然从技术上讲这是未定义的行为,但实际上它实际上总是按预期工作。)
JDK6文档非常好,源代码本身也很有启发性(它只使用了一个C联合):
JNIEXPORT jfloat JNICALL
Java_java_lang_Float_intBitsToFloat(JNIEnv *env, jclass unused, jint v)
{
union {
int i;
float f;
} u;
u.i = (long)v;
return (jfloat)u.f;
}
在绝大多数现代平台上,cpu上整数的默认大小是32位,浮点数的大小也是32位,所以我们假设两者之间的转换不会产生意外的结果。您可能已经知道这一点,但是在Java中不能将整数声明为unsigned,尽管您可以指定一个对应于1的十六进制值。正如利比和鲍尔斯先生所演示的那样,实际的转换是微不足道的,因为比特的解释方式不同。但是,在您可能试图处理二进制数据的几个场景中,该方法可能很有用。有几个有用的非标准技巧,比如这里描述的那些,它们依赖于利用IEEE 754浮点数的表示;当需要在位的整数表示和浮点表示之间进行转换时,可能会在某个地方使用该方法。