当我们在字节短数据类型中进行加法,减法,除法(等等)时,结果来自int值......为什么......?
例如: - 在上面的代码中没有编译,因为c中的结果来自int为什么会发生... ???当我们尝试使用系统打印c时,它出现错误,因为结果在int
public class A {
public static void main(String[] args) {
byte a = 12;
byte b = 10;
byte c = a + b;
System.out.println(c);
}
}
答案 0 :(得分:2)
根据java doc,当我们对两个字节执行操作时,输出可能是一个无法用byte处理的数字,因此java的创建者决定将其自动转换为Integer。所以就是这样。
答案 1 :(得分:2)
这里的答案很好,从相同的情景开始:) http://www.coderanch.com/t/499127/java/java/Adding-bytes
引用http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.6.2
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用扩展转换(第5.1.2节)进行转换必要时操作数: 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节)。然后: 如果任一操作数的类型为double,则另一个操作数转换为double。 否则,如果任一操作数的类型为float,则另一个操作数转换为float。 否则,如果任一操作数的类型为long,则另一个操作数转换为long。 否则,两个操作数都将转换为int。
答案 2 :(得分:0)
规范说:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.2
二进制+运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。
二元 - 运算符执行减法,产生两个数字操作数的差异。
对操作数执行二进制数字提升(第5.6.2节)。
请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。
数字操作数上的加法表达式的类型是其操作数的提升类型。
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:
如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。
应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则另一个操作数转换为float。
否则,如果任一操作数的类型为long,则另一个操作数转换为long。
否则,两个操作数都将转换为int。
如果将两者合并,则会看到添加中的任何操作数将被提升为int或long,并且任何小于int的原语将被提升为int。操作的结果是两个操作数的类型 - 它是int。
这背后的原因很可能是int是最常见的数据类型,它减少了溢出的可能性,同时不需要像long一样多的空间。空间参数可能不像过去那样普遍有效,但规范的那部分是像1995年那样定义的,并且是语言的固有部分(在不破坏兼容性的情况下你无法改变)。
答案 3 :(得分:0)
我们在char& amp;上执行的任何二进制算术运算byte数据类型(和short)将其提升为int。 有关详细信息,请参阅JLS 5.6.2。
答案 4 :(得分:0)
这有效:
final byte a = 12;
final byte b = 10;
byte c = a + b;
或者这个:
byte a = 12;
byte b = 10;
byte c = (byte)( a + b);