黑马程序员技术交流社区

标题: short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? [打印本页]

作者: Ak-47    时间: 2016-3-27 01:09
标题: short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?大神们讲解下呗{:2_30:}
作者: 小四姐姐    时间: 2016-3-27 01:16
需要强制类型
作者: Ak-47    时间: 2016-3-27 01:17
大神能详细说明下,此类型题的解法吗?
作者: adomwon    时间: 2016-3-27 08:49
short s1 = 1; s1 = s1 + 1;编译时程序会报错,因为默认整数类型是int类型,,s1和1进行运算时,会先将s1自动类型提升为int类型再与1进行运算,得到的结果是int类型,将一个int类型的数直接赋值给short类型的s1,,会损失精度,s1接不住,
解决办法,
加强制转换,short s1 = 1; s1 = (short)(s1 + 1);

作者: adomwon    时间: 2016-3-27 08:52
short s1 = 1; s1 += 1;没有错误
因为运算符参与运算的时候会自动加强制转换符.也就是说s1 += 1等效于s1 = (short)(s1 + 1);
作者: lennycxy    时间: 2016-3-27 09:31
长姿势了,加油
作者: xiaochenu    时间: 2016-3-27 12:26
short s1=1;s1=s1+1;这里的s1+1自动提升为Int类型了,原来的s1是short比int小要抢转,后面的应该是系统会自动帮你加强转符号吧,类似s1++
作者: zq019633    时间: 2016-3-27 16:10
1-Short s1=1 中s1是short类型的 ,1是int类型的 ,当数据类型小的向数据类型大的转换时,系统会进行隐式转化,但是,s1=s1+1中 s1+1需要进行强制转换成short类型的 也就是s1=(short)(s1+1);
第二句没错s1+=1中系统默认给进行了强转
作者: mbwhbyq    时间: 2016-3-27 20:04
因为1是一个整数,在JAVA中整数是默认为 int 类型的
前者(short s1 = 1; s1 = s1 + 1;)错在s1 = s1 + 1;这一步,这是一个short类型和int类型的相加,会自动提升为int类型相加,但却赋值给short类型的s1 ,这会损失精度。因为错误。
后者(short s1 = 1; s1 += 1;)中的s1 += 1;会自动添加强转符号,故不错误
作者: dingding1    时间: 2016-3-27 20:12
short s1 = 1; s1 = s1 + 1;编译时程序会报错,因为默认整数类型是int类型,,s1和1进行运算时,会先将s1自动类型提升为int类型再与1进行运算,得到的结果是int类型,将一个int类型的数直接赋值给short类型的s1,,会损失精度,s1接不住, 解决办法, 加强制转换,short s1 += 1; s1 = (short)(s1 + 1);
作者: 蛮王123    时间: 2016-3-27 20:22
我要多多学习   加油啦
作者: liuxingxing    时间: 2016-3-27 20:44
前一个损失精度;后一个没错
作者: Max灬xu    时间: 2016-3-27 20:53
short s1 = 1; s1 = s1 + 1; 整数系统默认是int型,因为short类型和int类型相加是要提升为int,再赋值给short类型数据可能会损失精度,需要加强转符 s1=(short)s1+1;而s1 += 1会自动加强转符,相当于s1=(short)s1+1;所以第二个不报错。
作者: chao1    时间: 2016-3-27 21:38
第一个:s1是short型,而1是int型,s1+1会自动提升为int型,相加完成后再赋值给s1会损失精度.
作者: yangxiong    时间: 2016-3-27 23:07
s1 += 1
/Reflector反编译后
short s = 1;
s = (short) (s + 1);
作者: Ak-47    时间: 2016-3-28 01:01
谢谢楼上的,有点懂了
作者: lavenderlmm    时间: 2016-3-28 11:19
(1)s1 = s1 + 1
在计算时,会首先将short类型的s1转换成int型数据和1进行相加运算,结果为int型,赋值给左边short型的变量s1会出现类型转换错误。
(2)s1 += 1
不会出错,因为使用+= 时,java自带类型转换机制
作者: kingblue    时间: 2016-3-28 13:07
1默认是整形,short参与运算时,会上转为int类型,因此结果s1是整型的,而s1定义为short型,因此会出现精度损失错误!
作者: fanxiaolin    时间: 2016-3-28 17:18
因为1是int类型!  去官网下视频看。快去学习,别水贴了
作者: wxf468907066    时间: 2016-3-28 19:26
s1 = s1 + 1这行代码中的s1是变量,1系统在编译过程中不知道他在不在short范围中,2,s1是一个short类型和后面1相加的话会全部提升会int类型,把int类型赋给short会损失精度.而对于s1+=1,这个的实质是s1=(short)(s1 + 1),强制把s1+1转出short这样就符合规则了
作者: 犹豫的烤肉拌饭    时间: 2016-3-28 23:16
s1 = s1 + 1 中的1默认为int ,int 的数和short相加, 结果会被隐性强转为int类型,把int类型的数据赋值给short的时候,会有溢出的风险,使数据损失精度,所以应该写成s1 = (short)(s1 + 1 );
作者: 千年白狐    时间: 2016-3-29 16:16
有错,前者会发生数据溢出,而后者不会有数据的溢出,+=是java的运算表达式,会自动转换数据类型,而前者不会转换类型
作者: Ak-47    时间: 2016-3-30 00:25
谢谢楼上的大婶们
作者: HXWANHC    时间: 2016-3-30 23:40
s1 = s1+1;会报错,这是因为在运算的时候,short类型的会自动提升为int类型,当两个int类型的相加得到的还是int类型的,把int类型的赋值给short类型需要强制转换,而这个没有转换,会有精度损失,修改为:s1 = short(s1+1);
作者: HXWANHC    时间: 2016-3-30 23:42
s1 = s1+1;会报错,这是因为在运算的时候,short类型的会自动提升为int类型,当两个int类型的相加得到的还是int类型的,把int类型的赋值给short类型需要强制转换,而这个没有转换,会有精度损失,修改为:s1 = short(s1+1);
而s1 += 1;不报错是因为这个隐藏了一个强制转换问题,等价于 s1 = short(s1+1);

作者: Ak-47    时间: 2016-3-31 01:13
大婶们的回答很好啊,让我豁然开朗啊
作者: doglovely    时间: 2016-4-3 18:09
涨姿势了!
作者: Ak-47    时间: 2016-4-3 19:01
你们的回答都是官方版本啊  {:2_30:}
作者: HeiMaZ    时间: 2016-4-5 00:12
short s1=1;s1=s1+1;中s1是short型与1相加结果int型,会出错,第二个没错的
作者: zxy5853    时间: 2016-4-5 23:02
1是int型,s1是short型,s1+1的结果也是int型,因为运算中的s1被默认提升为了int型,所以结果不能直接赋值给short型的s1,需要强制类型转换才能赋给s1。 s1 = (short)(s1 + 1);
作者: 15614014298    时间: 2016-4-6 10:49
第一个是数据类型自动提升了
作者: west2179    时间: 2016-4-6 23:42
short s1=1
s1+=1;

这样就不会有错,自加会在底层执行.
作者: wanbing522    时间: 2016-4-7 17:44
short s1 = 1; s1 += 1;或者short s1 =1;s1=(short)(s1+1);
作者: fanxiaolin    时间: 2016-4-13 20:49
很简单, 应为 shor  和byte  在进行运算的时候 , 会自动  转换成int 类型,  是
作者: fanxiaolin    时间: 2016-4-13 20:52
fanxiaolin 发表于 2016-4-13 20:49
很简单, 应为 shor  和byte  在进行运算的时候 , 会自动  转换成int 类型,  是 ...

short s1 = 1; s1 = s1 + 1 ;
其实是这样的  

s1 是 short  类型  但是  1 是 int  类型  

如果  s1 写成int 类型 就不错了  
如果 真的要强转的话    加short 就是了!
作者: 钱金磊    时间: 2016-4-14 00:32
adomwon 发表于 2016-3-27 08:49
short s1 = 1; s1 = s1 + 1;编译时程序会报错,因为默认整数类型是int类型,,s1和1进行运算时,会先将s1自动类 ...

说的可以吗!
作者: 张狮子    时间: 2016-4-19 22:59
定义的s1是short类型的,而1常量默认是int类型的,当执行s1 = s1 + 1;时,java虚拟机会提升右边s1的类型为int型进行运算,而算出的和是int,左边s1是short,int类型的范围比short类型范围大,所以赋值时,会产生精度丢失。编译失败。       而s1+=1;拆开是s1=(short)s1+1;,+=符号本身隐藏了强制转换,所以s1+=1;没有错。        
作者: 张狮子    时间: 2016-4-19 23:01
定义的s1是short类型的,而1常量默认是int类型的,当执行s1 = s1 + 1;时,java虚拟机会提升右边s1的类型为int型进行运算,而算出的和是int,左边s1是short,int类型的范围比short类型范围大,所以赋值时,会产生精度丢失。编译失败。而s1+=1;拆开是s1=(short)s1+1;,+=符号本身隐藏了强制转换,所以s1+=1;没有错。        
作者: 车前子008    时间: 2016-5-26 16:32
前者会进行自动转型   s1加1后  变成整数数据类型    后者不会报错
作者: cofujun    时间: 2016-5-27 22:06
short s1 = 1; s1 = s1 + 1;//计算时s1自动隐式向上转为int型,再赋值给s1时系统不能自动隐式向下转型,
short s1 = 1; s1 += 1;//不进行类型转换
作者: chengxiankun    时间: 2016-6-4 09:26
数字默认是int   一旦越界怎么办,所以强制类型转换
作者: cjc147    时间: 2016-9-9 01:20
正好我今天发表的java基础面试题中有对这个题目的讲解,供你参考。
http://bbs.itheima.com/thread-324592-1-1.html
作者: 轻语轻狂    时间: 2016-10-12 00:13
在s1 = s1 + 1 这个执行时,在这里右边的s1是作为变量参与运算,byte、short、char等类型的变量在参与运算时,会自动提升为int 类型,所以右边运算后得到的数据类型是int类型赋值给左边的short类型时会丢失精度,而右边又没有强制转换,所以系统会报错
作者: LARK    时间: 2016-10-12 08:56
s1=s1+1有错,运算时提升为int类型,赋值给short须强转。s1+=1没错,底层自带强转功能





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