程序让我失去精度误差,但我不能想到任何精度损失,因为数字很小
class Demo
{
public static void main(String args[])
{
byte b1=3;
byte b2=2;
byte b3=b1+b2;
System.out.println(b3);
}
}
答案 0 :(得分:8)
添加表达式b1 + b2
的类型为int
- 在int
之类的较小类型上没有定义任何加法运算符。因此,为了将其转换回byte
,您必须强制转换:
byte b3 = (byte) (b1 + b2);
请注意,虽然你碰巧知道值很小,但编译器并不关心你在前两行中设置的值 - 它们都可以为100知道。同样,虽然您知道您尝试分配给int
变量的byte
只是将两个byte
值相加的结果(或者更确切地说,两个值从byte
升级到int
),整个表达式只是int
,并且可能来自语言所涉及的任何地方。
(添加可以溢出的事实是一个单独的问题,但这将是一个不一致的参数 - 毕竟,您可以将两个int
值一起添加并将结果存储在int
变量中,即使添加可能很容易溢出。)
答案 1 :(得分:2)
因为127是byte的最后一个值。 假设b1 = 127且b2 = 2
现在发生了什么b = b1 + b2 = 129 [超出字节范围,即它在int范围内]
现在如果你把它b =(byte)(b1 + b2),你会得到-127这是由于将值四舍五入到byte。
答案 2 :(得分:2)
byte b1=3;
byte b2=2;
byte b3=b1+b2; // you can't use byte here, Every time addition will result
int value
因为,如果您尝试转换大于字节范围的int,则该值的丢失部分。因此,添加将不允许在此处使用字节。
答案 3 :(得分:0)
什么时候做+, - ,*,/,% java内部使用函数
ex:max(int,操作数1的dataType,操作数2的dataType);
在您的代码中 max(int,byte,byte)==>哪一个更大? ==> int 更大
所以你可能会遇到可能的压力损失 发现:int
必需:byte
另一个例子
short a =10;
byte b=20;
short c = a+b;
现在:
内部:max(int,OP1,OP2);
即max(int,short,byte)==>哪个更大的数据类型?的 INT 强>
所以java除了 int
int c = a+b; (works fine)
另一个例子:
long a =10;
byte b=20;
short c = a+b;
现在:
内部:max(int,OP1,OP2);
即max(int,long,byte)==>哪个更大的数据类型?的长强>
所以java除了长
long c = a+b;(works fine)
另一个例子:
byte b = 10;
b = b+1;
现在,
MAX(INT,字节)==>哪个更大的数据类型?的 INT 强>
所以,
int c = b+1;(works fine) or b = (byte) b+1;
希望你理解