java 中的数字大小
前提:我们知道IEEE 754标准在尾数(M)全0情况下,如果指数(E)全1,那么这个数表示无穷,如果指数(E)全0 ,那么这个数表示0 。e.g. 那么以float类型(32位)来说,应该是正无穷:0x7F800000表示正无穷
问题:(1)我们用如下语句:
float num=0x7F800000;
System.out.println(num);
那么输出是2.13909504E9,为什么?
(2)如果是System.out.println(Float.isInfinite(num))为什么是false?
(3)我们来看Float.POSITIVE_INFINITY的解释
A constant holding the positive infinity of type float
. It is equal to the value returned by Float.intBitsToFloat(0x7f800000)
.
解答:一切的来源都是因为对float的错误认识,我们知道,int x=0x7F80000可以得到一个十进制整数值,那么num=2139095040和x=2139095040是相等的,因为当我们用十六进制为float类型赋值时,只是赋予了num整数部分,也就是说num会被解析为2139095040(0x7f800000),而不是内存中的十六进制表示,因为java首先会把byte转换为int,
然后再赋予float。
intBitsFloat这个方法:就是将整数值按照IEEE754转变为Float类型,也就是说,在Float类型值和Int类型值在内存中是相等的。这也就解释了第三个问题
那么,如果我们想用十六进制赋予Float类型一个POSITIVE_INFINITY,怎么去做?
答案是死了这条心吧,我们可以从另一个方面去验证答案
float a=0x0.000000p-127f;
System.out.printf("%x\n", a);
看看报的异常:
Exception in thread "main" java.util.IllegalFormatConversionException: x != java.lang.Float
at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:3992)
at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2708)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2660)
at java.util.Formatter.format(Formatter.java:2432)
at java.io.PrintStream.format(PrintStream.java:920)
at java.io.PrintStream.printf(PrintStream.java:821)
at com.common.MD5.MD5.main(MD5.java:17)
也就是说,float不支持十六进制表示,我们可以用上述a那样的十六进制去赋予float类型值,但是不能像其在内存值那样去赋予它(那只有整型才能做到)
所以我们只能借助整型去得到POSITIVE_INFINITY,也就是利用方法Float.intBitsToFloat
上一篇: java语言中的插入
下一篇: 使用java求1~100的所有质数