用字节进行类型转换的规则

时间:2013-07-05 05:47:23

标签: java casting

我只是在玩类型铸造。这是代码:

class Typecasting {
    public static void main(String[] args) {
       byte b = 3;
       byte c = b++;   // no error
       byte d = b + 1; // error
       byte e = b + b; // error
    }
}

为什么第一行没有错误但是第二行?当我做的时候

f = b + 2;

我了解b被自动转换为int类型,因此f必须是int类型,但是当我这样做时

e = b + b;

它们都是byte类型,其结果也在byte范围内,那么为什么e不能拥有byte数据类型?是由于+二元运算符吗?

6 个答案:

答案 0 :(得分:3)

  

为什么第一行没有错误但是第二行?

因为这是定义语言的方式。没有byte + byte运算符,这就是第三行失败的原因 - 两个操作数都会自动提升为int。来自section 15.18.2 of the JLS

  

二进制+运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。

     

...

     

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

现在,binary numeric promotion的值始终为intlongfloatdouble ... int 。因此,操作是将两个int值相加,结果为int

但对于b++,类型仍为byte。这是一个postfix increment expression (section 15.14.2)

  

后缀增量表达式的类型是变量的类型。

在相关的说明中,这没关系:

b += 3;

那是compound assignment (section 15.26.2)

  

E1 op= E2形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2)),其中TE1的类型,但E1仅被评估一次。

注意铸造部件,这就是它起作用的原因。

答案 1 :(得分:0)

+(byte, byte)根据语言规则返回int

规范的相关部分是§5.6.2:

  

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用扩展转换(第5.1.2节)进行转换必要时操作数:

     
      
  • 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节)。然后:
  •   
  • 如果任一操作数的类型为double,则另一个操作数将转换为double
  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数将转换为float
  •   
  • 否则,如果任一操作数的类型为long,则另一个操作数将转换为long
  •   
  • 否则,两个操作数都将转换为int 类型。
  •   

而对于++,结果的类型是操作数的类型。来自JLS,§15.14.2:

  

后缀增量表达式的类型是变量的类型。

因此,对于b++,结果 byte,因此可分配给c

答案 2 :(得分:0)

byte d = b+1; 

在这里,你将int值(b + 1)赋给byte d。将int值添加到字节值时,它将变为int值。

答案 3 :(得分:0)

byte c = b++; //No error;First Line

这符合JLS 15.14.2

  

后缀增量表达式的类型是变量的类型。后缀增量表达式的结果不是变量,而是值。

byte d = b+1;   //error;Second Line
byte e = b+b;    //error;Third line

这符合JLS 15.18.2

  

二进制+运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。

     

数字操作数上的加法表达式的类型是其操作数的提升类型。

     

如果此提升类型为int或long,则执行整数运算。

了解JLS 5.6.2

中的类型宣传
  

应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:

     

如果任一操作数的类型为double,则另一个操作数转换为double。

     

否则,如果任一操作数的类型为float,则另一个操作数转换为float。

     

否则,如果任一操作数的类型为long,则另一个操作数转换为long。

     

否则,两个操作数都将转换为int类型。

答案 4 :(得分:0)

第一行中的

++运算符返回总是操作数类型的结果..因此它没有错误

在第二行这里1是一个整数类型,因为默认情况下所有整数类型文字都是int

第三行中的

+(byte,byte)返回整数类型,说明为什么它会强制您将其强制转换为int。

- >在第三行中,字节类型总是有溢出的概率。    * 如果您的字节类型被定义为常量,那么它不会强制您进行类型转换,因为它总是在范围内。

答案 5 :(得分:-1)

当Java执行求和时,它首先将两个操作数“转换”为 int long (取决于操作数),结果将是一个整数,尝试分配你的byte类型的变量,因为它“意识到”结果不适合一个字节,然后它会“抱怨”,你甚至无法编译它。