如果我有一个字节变量: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 ?
答案 0 :(得分:25)
因为b += 1
等同于b = (byte)(b + 1)
,而b + 1
的类型会提升为int
(JLS §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