Java 中的原始整数数据类型限制

问题描述 投票:0回答:1

我有一个Java程序来显示原始整数数据类型的限制,如下所示:

import static java.lang.Math.*;

class HelloWorld {
    public static void main(String[] args) {
        System.out.println((byte)Math.pow(2,8-1));
        System.out.println((byte)(Math.pow(2,8-1)-1));
        System.out.println((short)(pow(2,16-1)));
        System.out.println((short)(pow(2,16-1)-1));
        System.out.println((int)(pow(2,32-1)));
        System.out.println((int)(pow(2,32-1)-1));
        System.out.println((long)(pow(2,64-1)));
        System.out.println((long)(pow(2,64-1)-1));
    }
}

其输出如下:

-128
127
-32768
32767
2147483647
2147483647
9223372036854775807
9223372036854775807

您能解释一下为什么会输出 int 和 long 类型转换吗?

我期待类似的事情

-128
127
-32768
32767
-2147483648
2147483647
-9223372036854775808
9223372036854775807
java types casting integer long-integer
1个回答
0
投票

您正在转换为“整数”类型

after
,您减去
1
。对于整数和长整型,浮点值会根据
1
的减法进行调整,超出这些类型可以容纳的精度。因此,转换为 int 或 long 不包括该特定差异。

这是长转换的示例。

double result1 = Math.pow(2,64-1);
double result2 = Math.pow(2,64-1)-1;

System.out.println(result1);
System.out.println(result2);
long bits = Double.doubleToRawLongBits(result1);
System.out.println(bits);
System.out.println(Long.toBinaryString(bits));
bits = Double.doubleToRawLongBits(result2);
System.out.println(bits);
System.out.println(Long.toBinaryString(bits));

打印

9.223372036854776E18
9.223372036854776E18
4890909195324358656
100001111100000000000000000000000000000000000000000000000000000
4890909195324358656
100001111100000000000000000000000000000000000000000000000000000

请注意,这些值是相同的。由于精度损失,减法没有产生任何影响。对于整数来说也是如此。这种精度差异不会影响较短宽度的类型。

© www.soinside.com 2019 - 2024. All rights reserved.