为什么byte + = 1编译但是byte = byte + 1不?

时间:2011-02-11 13:08:18

标签: java types

如果我有一个字节变量:byte b = 0;

为什么以下工作:

   b++;
   b += 1; // compiles

......但这不是吗?

   b = b + 1; // compile error

编译器首先理解为byte,第二理解为int吗?

[编辑]

我知道施法,但我想提请你注意b++, b += 1 and b = b + 1

我认为它们是平等的,为什么编译器会有所不同呢?有什么区别

  b += 1 and b = b + 1 ?

8 个答案:

答案 0 :(得分:25)

因为b += 1等同于b = (byte)(b + 1),而b + 1的类型会提升为intJLS §5.6.2 Binary Numeric Promotion),因此无法将其结果分配给byte {{1}}没有明确转换。

来自JLS, §15.26.2 Compound Assignment Operators

  

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

答案 1 :(得分:3)

可能会导致精度下降。施展它就可以了。

b = (byte) (b + 1);

答案 2 :(得分:2)

是的,+ - 操作的结果为int,因此需要进行投射以将其分配给byte变量。

答案 3 :(得分:2)

在java中,整数的默认值是int,对于浮点数,它是double。所以b默认转换为整数来执行操作。因此,在存储之前需要对得到的答案进行类型转换,以防止任何可能的精度损失。但b+=1会自动执行此操作。

答案 4 :(得分:1)

byte和short类型的操作数在传递给运算符之前会自动提升为int

所以当你做字节b = b + 1; 它认为它是“int”,因为操作是在字节值上执行的。所以为了避免这种情况,我们使用b + = 1;在这里,它自动被类型化为字节。

答案 5 :(得分:0)

你需要转换为byte:

b = (byte) (b + 1);

答案 6 :(得分:0)

执行b + 1会将结果扩展为整数,并且返回字节b将导致精度损失。解释:Conversions and Promotions。但我更喜欢axtavt的答案。

答案 7 :(得分:0)

我不会购买关于精度损失的论据,因为在处理int和long时,编译器不会以类似的方式保护你。 我认为真正的答案在于JLS只是更好地支持int而不是字节,如下面的答案中所述: https://stackoverflow.com/a/13211737/567000