黑马程序员技术交流社区

标题: short s=5; s=s+2; 运算中s的数据类型是怎样变化的? [打印本页]

作者: 杨永峰    时间: 2012-5-16 13:12
标题: short s=5; s=s+2; 运算中s的数据类型是怎样变化的?
本帖最后由 杨永峰 于 2012-5-16 13:30 编辑

如果运行类似  short s=5; s=s+2; 这样的语句,是会出现错误的。s = s + 2; 中,在进行算术运算 s + 2 时,s 是之前定义的s的一个复制还是s本身?如果是s本身,那么算术运算后s对应的存储区域类型提升为int,但是 s = s + 2 赋值号左边的s 的数据类型并没有变化,在编译环境的眼中,仍然是最初定义的那个s,所以赋值失败??或者是其他的什么情况?     s = 8;是正确的,那么 8 和 (s + 2 )的区别是什么?

作者: 赵玮_Tom    时间: 2012-5-16 13:21
楼主不妨把下面这两句运行一下:
short s = 5;
s+=2;
希望对你有帮助
作者: 冯越    时间: 2012-5-16 13:24
s当然还是本身的s,他的类型也是不会变化的依然是 short 的。你问的这个问题的根源在于 算术预算赋值部分, s = s + 2; 当你在编译器里打出这句的时候编译器是会报错的。 因为 (s + 2) 系统会默认的把他当成 int 而你去赋值的却是 short 所以 你只需要这样改:s = (short)(s+2)就对了 。 = 左右两边的类型就一致了!

作者: 古银平    时间: 2012-5-16 13:26
short s=5; s=s+2中2是int型的,那么java会把s自动提升为int型,那么结果s+2为int型赋给一个short型会出错,会损失精度,改为s+=2就不会了,因为+=是一个运算符号,java会把2当成short型来处理
作者: 孙峰    时间: 2012-5-16 14:27
这个问题毕哥视频中第二天的有讲。
      s=s+2 中是做两次运算,一、先计算s+2,此时得到int型数据。二、再讲得到的int数据赋给原short型的s,两种数据类型不同,此时不会做自动转换-——————错误。
     s+=2   中 只做一次运算,将“=”左右两边数值的和赋给s,此时会自动转换。 跟short s=2,大致相同,只要是2在 short的范围内就可以。
   
作者: 于陈    时间: 2012-5-16 14:56
short s=3;
s=s+2;
首先java里面整数默认为int型,那么 short型的s和int型的2相加,为了不损失精度,默认的向高精度转换,得到一个int型的结果,现在你又把这个int类型的数赋值给short型的s,就会报错有可能损失精度,解决办法就是强制转换 s=(short)(s+2)
int s=8;
s=s+2;
这句为什么正确,

int型的s+int型的2结果依然是int型,把一个int赋值给int当然没问题了~

哥们,我昨天才看完毕老师的第二天的视频,很清楚的记得毕老师经过这类问题,我建议你还是仔细看下基础视频吧~
作者: 杨永峰    时间: 2012-5-16 16:40
于陈 发表于 2012-5-16 14:56
short s=3;
s=s+2;
首先java里面整数默认为int型,那么 short型的s和int型的2相加,为了不损失精度,默 ...

谢谢,s + 2 不能赋值给short类型的变量,说明s+2不是int型的常量。那么s+2存储在提升为int型的s中还是存储在新的存储空间中?如果s已经提升为int型了,s + 2 完全可以赋值给它。其实我问的是具体的编译过程是怎样的?
作者: 王晓龙    时间: 2012-5-16 22:48
short s=3;
s=s+3;3是int  s被升为int (s+3)值为int 但s为short 所以错误
s=(short)(s+3);
s+=3都是正确(这个默认自动转化啦)
作者: 杨康    时间: 2012-5-16 22:59
short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以就变成了int型的5和int型的2求和,得到的结果就是int型的7,再重新赋值给short型的s,就会提示损失精度。
作者: 杨永峰    时间: 2012-5-17 12:24
杨康 发表于 2012-5-16 22:59
short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以就 ...

short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以就变成了int型的5和int型的2求和,得到的结果就是int型的7,再重新赋值给short型的s,就会提示损失精度。

红色部分是不是矛盾了?这正是我纠结的地方?s 提升为int了,为啥后面又赋值给short型的s了?s 想变啥就变啥啊?
作者: 杨康    时间: 2012-5-17 12:56
杨永峰 发表于 2012-5-17 12:24
short s = 5 , s = s +2 运算时 先将short型的s 提升为int型,因为在java中,整数数据类型是int型,所以 ...

因为是先求和,在赋值,在求和的过程中,低精度的s与java默认的int型数据进行求和,就会将byte类型强制转换成高精度的int型,所以转换后就成int型的s跟2求和,得到的结果也就是int型的7.但是你定义的s是byte型的,在把7给s重新赋值时,int型的值赋值给byte型,java就会报错。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2