我知道精度损失错误的出现是因为:非强制性,将一个“高精度”的值,赋值给一个“低精度”的变量。以下我列出了4种情况:
(有精度损失错误,我简写为‘有’,否则写‘无)
情况1:
short a = 1;
a = a + 2;//有情况2:
short a = 1;
short b = a + 1;//有情况3:
short a = 1;
a += 2;//无情况4:
short a = 2 + 1;//无
(有精度损失错误,我简写为‘有’,否则写‘无)
情况1:
short a = 1;
a = a + 2;//有情况2:
short a = 1;
short b = a + 1;//有情况3:
short a = 1;
a += 2;//无情况4:
short a = 2 + 1;//无
a += 2;//无
等同于
short a = 1;
a = (short)(a+2);
即跟你的情况4是等同的
若此,
short a = 2;
short b = a + 2;为什么还是会报错!!!!
short b = a + 2;
//a+2是int(整数默认就是int的,带小数点默认就是double的),赋值给short属于向下转型,必须要强制转换
short a = 1;
a += 2;//无
//编译器自动给你加上了强制转型
情况4:
short a = 2 + 1;//无
//这个其实就是short a=3,当然不会错
那么,请问下,Java中,在运算过程当中,据你所知,出了+=类型外,还有什么运算会是强制转化
的呢?
我刚才试了下,自增1也是强制转型的。
比如:
short a = 2;
a ++;
是不会报错的。
我只知道
short a = 1;
a = a + 2;
会因为int向short转型而报错。
以为a += 2;是等价于 a = a + 2;的。O(∩_∩)O~对了,我是第一次发帖子的。
帖子里有40分,点击“对我有用”只能给1分。
有什么办法可以给更多分吗?
a = a + 2;//有
ps:a+2---->int 类型的,这儿有表达式类型的提升。
将int ---》short 。情况2:
short a = 1;
short b = a + 1;//有
ps:理由同上。
情况3:
short a = 1;
a += 2;//无
a=(short)(a+2);
这个进行了强制转换,不会丢失精度。
情况4:
short a = 2 + 1;//无
ps:这个相当于short a=3;初始赋值在short表示的范围内。不会丢失精度。
但是当short a = b+ 1 (b为一个short时),这时就会多一个表达式类型的提升的情况,b 为short ,1为INT,结果为 b+1 为INT 类型, int ---》short 这时就需要强制类型的转换了。
那么,据你所知,是否还有其它类似于"+="的运算(*=、-=不算),会出现强制转型?
eg.+= 这样的形式:
short b=+1<====>short b=(short)(b+1);会将右边的值自动转为与左边类型一样的值.
因此这样的写法应该少用.因此这样写的时候不会报错.
如果用 short b=b+1,这样写的话 ,就少了一个转型,因此就会报错.