0

我知道一个数据类型会自动提升为上层数据类型 byte-short-int

class Temp {
    void check(byte x) {
        System.out.println(x + " is the byte type");
    }

    void check(short x) {
        System.out.println(x + " is the short type");
    }

    void check(int x) {
        System.out.println(x + " is the int type");
        int y = x;
        System.out.println(y + " is the int type");
    }

    void check(long x) {
        System.out.println(x + " is the long type");
    }

    void check(float x) {
        System.out.println(x + " is the float type");
    }

    void check(double x) {
        System.out.println(x + " is the double type");
    }

    public static void main(String args[]) {
        byte b = 42;
        char c = 'a';
        short s = 1024;
        int i = 50000;
        float f = 5.67f;
        double d = .1234;
        double result = (f * b) + (i / c) - (d * s);
        System.out.println((f * b) + " + " + (i / c) + " - " + (d * s));
        System.out.println("result =" + result);
        Temp t = new Temp();
        t.check(f * b);
        t.check(i / c);
        t.check(d * s);
        t.check(b + b);
        t.check(b * b);
        t.check(b * b * b);
        t.check(b * b * b * b * b * b * b * b * b);
        t.check(b * b * b * b * b * b * b * b * b * b * b * b * b * b * b * b
                * b * b * b * b * b * b * b * b * b * b * b * b * b * b * b);
        t.check(b * b * b * b * b * b * b * b * b * b * b * b * b * b * b * b
                * b * b * b * b * b * b * b * b * b * b * b * b * b * b * b * b
                * b * b * b * b * b);

    }
}

输出:

238.14 + 515 - 126.3616
result =626.7784146484375
238.14 is the float type
515 is the int type
515 is the int type
126.3616 is the double type
84 is the int type
84 is the int type
1764 is the int type
1764 is the int type
74088 is the int type
74088 is the int type
-1889539584 is the int type
-1889539584 is the int type
-2147483648 is the int type
-2147483648 is the int type
0 is the int type
0 is the int type

我的问题是为什么 b*b 提升为 int 因为 42+42=84 并且字节范围是 -128 到 127。84 在范围内。此外,为什么

t.check(b * b * b * b * b * b * b * b * b * b * b * b * b * b * b * b
                * b * b * b * b * b * b * b * b * b * b * b * b * b * b * b);

这条线得到 0 为什么不将它提升一倍。

4

1 回答 1

5

我的问题是为什么 b*b 提升为 int

因为这就是语言规范所说的它会做的事情。

以及为什么 [...] 这条线得到 0 为什么不提升到那个双

同样,因为这不是语言的定义方式。

阅读JLS 的第 15.17 节

乘法运算符具有相同的优先级并且在语法上是左结合的(它们从左到右分组)。

乘法运算符的每个操作数的类型必须是可转换(第 5.1.8 节)为原始数值类型的类型,否则会发生编译时错误。

对操作数执行二进制数字提升(第 5.6.2 节)。

二进制数字提升 ( 5.6.2 ) 会将byte操作数提升为int,因此int * int在代码中的所有情况下都会得到算术。在第一种情况下,您已经将byte * byte两个操作数提升为int; 对于长线,你有一个byte * byte,其余的是int * byte,只有第二个操作数被提升到int。该选择是在编译时做出的,与执行时的值无关 - JVM 不会决定将值提升为,double因为它们超出了int.

于 2013-10-16T19:58:24.810 回答