在学习隐式和显式类型转换时,我尝试了以下代码:
class Implicit
{
public static void main(String args[])
{
byte a=10;
byte b=20;
a=a+b; //
System.out.println(a);
}
}
编译器报告:
我尝试使用此代码来查看一元运算符或此类示例中的任何其他操作是否会导致右侧的数据类型发生更改。
这是发生在这里的事吗?如果是这样,原因是什么?还有哪些其他情况会导致数据类型被改变?
答案 0 :(得分:4)
编译器警告你,因为byte+byte = int
因此,它会警告你何时尝试添加两个字节(在添加后基本上是一个int)并将其分配给一个字节,这会导致精度损失,因为字节可以只保存8位,因为int可以容纳32位。
但是,当您使用compound assignment operator时,这不会给您一个警告。
a+=b; //
答案 1 :(得分:1)
警告你
可能会失去精确度
因为加法运算符会导致每个byte
值在添加完成之前被提升为int
(二进制数字促销)。因此,字节+字节将是int
结果,并且要分配回字节a
,它需要将int
转发为byte
。如果加法的值大于可以存储为byte
值,则向下转换可能导致精度损失。
您可以强制编译器通过显式向下转发为a=(byte)(a+b)
来接受这一点,其中您知道风险和编译器的信号不应该关注。
答案 2 :(得分:0)
add操作导致byte变量被提升为int。
查看此问题的答案Add bytes with type casting, Java
我不知道为什么用java,但似乎c#(是的,c#有类似的结果),它的性能也是如此。有关详细信息,请参阅此处byte + byte = int... why?