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