欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 中的数字大小

程序员文章站 2024-03-14 19:50:29
...

前提:我们知道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语言