我知道数据类型会自动提升为上层数据类型 字节短-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,为什么不把它推广到加倍。
答案 0 :(得分:5)
我的问题是为什么b * b提升为int
因为这就是语言规范所说的。
为什么[...]这一行得到0为什么不升级到那个双
同样,因为这不是语言的定义方式。
乘法运算符具有相同的优先级,并且在语法上是左关联的(它们从左到右分组)。
乘法运算符的每个操作数的类型必须是可转换(第5.1.8节)到基本数字类型的类型,否则会发生编译时错误。
对操作数执行二进制数字提升(第5.6.2节)。
二进制数字促销(5.6.2)会将byte
操作数提升为int
,因此您在代码中的所有情况下都会使用int * int
算术。在第一种情况下,您已经byte * byte
,因此两个操作数都被提升为int
;对于长行,您有一个byte * byte
,其余为int * byte
,其中只有第二个操作数被提升为int
。该选择是在编译时进行的,与执行时的值无关 - JVM不会决定将值提升为double
,因为它们超出了int
的范围。