我正在用Herbert的书学习Java : Java入门指南。在这本书中,出现了这样的代码:
// A promotion surprise!
class PromDemo{
public static void main(String args[]){
byte b;
int i;
b = 10;
i = b * b; // OK, no cast needed
b = 10;
b = (byte) (b * b); // cast needed!!
System.out.println("i and b: " + i + " " + b);
}
}我不明白为什么我必须在行中使用(字节):
b = (byte) (b * b); // cast needed!!B被定义为一个字节,b*b的结果是100,这是一个字节的正确值(-128.127)。
谢谢。
发布于 2015-06-26 15:12:53
JLS (5.6.2.二进制数字提升)给出了将数字类型与二进制运算符(如乘法运算符(*))组合的规则:
最后一点适用于您的情况,字节被转换为ints,然后乘以。
发布于 2015-06-26 15:10:55
在Java中,当有这样的计算时,字节和短将总是被提升为int:
byte b = 10;
b = (byte) (b * b);因此,您实际上将一个整数乘以一个整数,它将返回一个整数。由于不能将整数赋值给字节,所以需要转换。
这被称为“自动类型推广”,如果你想谷歌它(查找例如https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2)
https://stackoverflow.com/questions/31076537
复制相似问题