数据类型和变量java

时间:2015-12-02 11:59:57

标签: java

当我们在字节短数据类型中进行加法,减法,除法(等等)时,结果来自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);
    }
}

5 个答案:

答案 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);