0

该程序给了我精度误差的损失,但我想不出任何精度损失,因为数字很小

这是代码##

 class Demo  
 {  
   public static void main(String args[])  
   {  
      byte b1=3;  
      byte b2=2;  
      byte b3=b1+b2;  
      System.out.println(b3);  
   }  
 }
4

4 回答 4

9

加法表达式b1 + b2是类型的int- 没有在比 . 更小的类型上定义任何加法运算符int。因此,为了将其转换回 a byte,您必须强制转换:

byte b3 = (byte) (b1 + b2);

请注意,尽管碰巧知道这些值很小,但编译器并不关心您在前两行中设置的值——就它所知,它们都可能是 100。同样,尽管知道int要分配给byte变量的只是将两个byte值相加的结果(或者更确切地说,从byteto提升的两个值int),但整个表达式是公正的int,并且可能来自任何地方就语言而言。

(加法可能溢出的事实是另一回事,但这将是一个不一致的论点 - 毕竟,您可以将两个int值相加并将结果存储在一个int变量中,即使加法可能很容易溢出。)

于 2013-07-29T06:57:36.360 回答
3

因为 127 是字节的最后一个值。假设 b1 = 127 且 b2 = 2

现在发生了什么 b = b1+b2 = 129 [超出字节范围,即在 int 范围内]

现在,如果你将它转换为 b = (byte)(b1+b2),你将得到 -127,这是由于将值四舍五入为字节。

于 2013-07-29T06:58:49.950 回答
3
    byte b1=3;
    byte b2=2;
    byte b3=b1+b2;  // you can't use byte here, Every time addition will result 
                     int value

因为,如果您尝试强制转换大于字节范围的 int,则该值会丢失部分。所以加法不允许在这里使用字节。

于 2013-07-29T07:06:52.200 回答
0

当你做 +,-,*,/,% 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;

希望你能理解

于 2013-07-29T07:01:48.920 回答