【问题标题】:Java (Implicit type casting): Does a unary operator affect the data type of the variables in operation?Java(隐式类型转换):一元运算符是否会影响操作中变量的数据类型?
【发布时间】:2013-04-19 10:31:04
【问题描述】:

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

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

        a=a+b; //

        System.out.println(a);
    }
}

编译器报告:

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

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

【问题讨论】:

    标签: java types casting


    【解决方案1】:

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

    但是,当您使用compound assignment operator 时,这不会给您一个警告。

        a+=b; //
    

    【讨论】:

    • 注意:byte 在 JVM 级别几乎不存在。
    【解决方案2】:

    它会警告你的

    可能的精度损失

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

    您可以强制编译器通过明确地向下转换为a=(byte)(a+b) 来强制编译器接受这一点,其中表示您知道风险并且编译器不应该关心的信号。

    【讨论】:

      【解决方案3】:

      add 操作导致字节变量被提升为 int。

      查看这个问题的答案Add bytes with type casting, Java

      我不太清楚为什么使用 java,但似乎对于 c#(是的,c# 有类似的结果),这是为了性能。详情见这里byte + byte = int... why?

      【讨论】:

        猜你喜欢
        • 2021-06-16
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 2014-05-30
        • 1970-01-01
        • 2022-07-01
        相关资源
        最近更新 更多