【发布时间】:2013-03-20 20:00:13
【问题描述】:
当我尝试做这样的事情时遇到错误:
byte a = 23;
a = a - 1;
编译器给出这个错误: Test.java:8:发现可能的精度损失:int required:byte a = a - 1; ^ 1 个错误
强制转换不能解决错误... 为什么编译器不让我这样做? 我是否需要将变量“a”转换为 int?
【问题讨论】:
当我尝试做这样的事情时遇到错误:
byte a = 23;
a = a - 1;
编译器给出这个错误: Test.java:8:发现可能的精度损失:int required:byte a = a - 1; ^ 1 个错误
强制转换不能解决错误... 为什么编译器不让我这样做? 我是否需要将变量“a”转换为 int?
【问题讨论】:
这样做:
a -= 1;
您甚至不需要显式转换,编译器/JVM 会为您完成。
您是否应该将变量类型更改为 int 没有人可以说,只有您提供的信息。
变量类型由您计划使用它执行的任务定义。
如果你的变量 a 计算某人手上的手指,你为什么要使用 int?字节类型已经足够了。
【讨论】:
在 Java 数学中,在计算之前,所有内容都至少提升为 int。这称为Binary Numeric Promotion (JLS 5.6.2)。所以这就是编译器找到int 的原因。要解决此问题,请将整个表达式的结果转换回 byte:
a = (byte) (a - 1);
【讨论】:
这样做。
a = (byte)(a - 1);
当你从 a 中减去 1 时,它的整数值。因此,要以字节为单位分配结果,您需要进行显式类型转换。
【讨论】:
a = a - 1; // 这里在减法之前将 a 提升为 int 数据类型,'a-1' 的结果变为 int 不能存储在 byte 中(byte = 8bits and int = 32 bits)。
这就是为什么你必须将它转换为一个字节,如下所示:
a = (byte) (a - 1);
【讨论】: