1

在学习隐式和显式类型转换时,我尝试了以下代码:

class Implicit
{
    public static void main(String args[])
    {
        byte a=10;
        byte b=20;

        a=a+b; //

        System.out.println(a);
    }
}

编译器报告:

在此处输入图像描述

我尝试了此代码以查看此类示例中的一元运算符或任何其他操作是否会导致右侧的数据类型发生更改。

这是这里发生的事情吗?如果是这样,原因是什么?还有哪些其他情况会导致数据类型改变?

4

3 回答 3

4

编译器会警告您,因为byte+byte = int因此,它会警告您何时尝试添加两个字节(本质上是添加后的 int)并将其分配给一个字节,这将导致精度损失,因为 byte 只能保存 8 位,而作为 int可容纳 32 位。

但是,当您使用复合赋值运算符时,这不会给您警告。

    a+=b; //
于 2013-04-19T10:32:54.420 回答
1

它警告你

可能的精度损失

因为加法运算符会在加法完成之前将每个byte值提升为 an int(二进制数字提升)。所以 byte+byte 将是一个int结果,并分配回a它需要向下转换intbyte. 如果加法的值大于可以存储为byte值的值,则向下转换可能会导致精度损失。

您可以通过显式向下转换来强制编译器接受这一点,a=(byte)(a+b)因为您知道风险和编译器不应该关心的信号。

于 2013-04-19T10:37:38.417 回答
0

add 操作导致 byte 变量提升为 int。

请参阅此问题的答案Add bytes with type cast, Java

我不太清楚为什么使用 java,但似乎对于 c#(是的,c# 有类似的结果),这是为了性能。有关详细信息,请参见此处byte + byte = int ... 为什么?

于 2013-04-19T10:35:19.337 回答