A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 646245771 中级黑马   /  2014-4-21 14:25  /  1244 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 646245771 于 2014-4-21 16:26 编辑

同样还是看了毕老师的视频,关于类型转换的
byte x = 1;

x = (byte)(x+1);

结果是 x = 2

然后通过延伸  
x = (byte)(x)+1;这个是不靠谱的。是因为X本身就是byte类型的,然后这样的强转的没有任何实质性的意义的,自然也就是编译失败,丢失精度。

那么我的问题是,x =x +(byte)(1),为什么也是丢失精度呢?
同样的 还有 x = (byte)(x)+(byte)(1),本人小白,请不要见笑,请大神帮忙详细的解答一下原理。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

6 个回复

倒序浏览
1是int类型,占的字节数和byte不一样。一定要将1转换成byte类型精度当然丢失了。
回复 使用道具 举报
你为谁归来 发表于 2014-4-21 14:36
1是int类型,占的字节数和byte不一样。一定要将1转换成byte类型精度当然丢失了。 ...

只是这样么?我再想想,先谢谢你了。
回复 使用道具 举报
还有没有其他大神的详细讲解{:2_30:} 我想再多听听
回复 使用道具 举报
本帖最后由 NewDemo 于 2014-4-21 15:19 编辑

x =x +(byte)(1) 你这样写的不叫类型转,写法只能是这样的x=(byte)(x+1)

  1. byte a = 1;
  2.                 byte b =1;
  3.                 byte x = 66;
  4.                 byte y = 90;
  5.                 byte c =a +b;//byte类型做 +-*/都会丢失精度,即使都是byte类型都不行  这句话编译不会通过
  6.                 System.out.println(a+b);//系统进行了强转动作  所以编译可以通过,结果是2
  7.                 System.out.println(x+y);//系统进行了强转操作,所以结果是156
  8.                 System.out.println((byte)(x+y));//因为byte的取值范围是-128~127,所以这样的强转就会出现-100的结果
  9.                 System.out.println((int)(a+b));//这里将类型提升后结果就是156
  10.                 a+=b;//这句话会自动进行类型提升,所以打印a的结果同样是156
  11.                 System.out.println(a);
复制代码


下面引用别人的一些经典回答

提升为int,在进行相加。我们下看下边代码:
  • class Test
  • {
  •         public static void main(String[] args)
  •         {
  •                 byte a=1,b=1;
  •                 byte c =a+b;
  •                 System.out.println(c);
  •         }
  • }

[color=rgb(177, 8, 0) !important]复制代码

编译时就会提示损失精度,需要byte,找到int。
如果是先相加得到结果再提升,此时a+b=2,没有超出byte类型,按理说不应该自动提升数据类型了,但是结果还是提升了。
由此可见,先相加得到结果再提升数据类型 不成立。

另外,提一点,楼主代码中,System.out.println((int)(a+b));结果之所以是-100,是因为楼主采用的是中问字符的括号,因此编译时提示异常,并显示-100,正常情况下,结果仍然是156.
只有在把这个结果强转回byte型时,才会得出-100.
原因是,计算结果是计算结果是int型,是32位,而byte最高只有8位,8为存储的正数最高是127(0111 111),因此存储不下计算结果。
强制转换时会把int型156(0000 0000 0000 0000 0000 0000 1001 1100)的前24位全部忽略掉,变为1001 1100,对应十进制-100.



评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
沙发说的不味
x = (byte)(x)+(byte)(1)   在底层是是这样运行的  x与1先进行自动提升int类型相加,然后才将x与1分别进行类型转换,这时的转换已经毫无意义  最后将int结果赋予x  自然发生精度丢失  
x =x +(byte)(1)也是同理
楼主换一种   x = (byte)(x+1)这样的,这是先将x与1进行相加  得出的结果再强制转换为int类型  
   
回复 使用道具 举报
最后一句说错了  得出的结果再强制转换为byte类型  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马