黑马程序员技术交流社区

标题: 关于short数据类型的问题 [打印本页]

作者: 红茶2331    时间: 2013-11-12 19:28
标题: 关于short数据类型的问题
今天老师留的一道题,不知道什么原理啊?

short s1 = 1; s1 = s1 + 1;编译为什么会出错啊?
short s1 = 1; s1 += 1;怎么就可以通过编译呢


作者: wjj410830911    时间: 2013-11-12 20:01
因为short  s1 = 1  1本来默认为int类型的  但1赋值给了 short类型的s1  而后面的 s1 = s1 + 1   
1还是默认的int类型的  而int与short2个类型是不能直接参与运算 所以报错了 会损失精度

而第二个  +=号是  赋值运算符   自身默认会强制转换数据类型的   s1 = (short)(s1 + 1)
作者: Θ动@咚Θ    时间: 2013-11-12 20:03
计算机运算中有两个规则 1.如s1=1和s1+=1这样的的等号右侧是常数表达式,这时候,可以int32到int16的隐式转换;2.另一个规则是:等号右侧的计算表达式默认推定为int32,哪怕是两个int16相加,它不能够隐式转换为int16。
s1 = s1 + 1;等号右侧是计算表达式,计算的结果根据规则2我们可以知道是int类型的,那么赋值给左边的short类型的s1就会报错。
s1 += 1 等号右侧是常数,这时候计算机可以把右侧的int类型隐式的转换为short类型,再赋给左侧的shor类型的s1,所以没有问题
作者: 马富林    时间: 2013-11-12 20:13
简单说就是short s1 = 1; 之后s1是short型数据。
而数字1师默认为int型的数据。
所以s1+1是short和int型一起运算。得出的结果自动成为int型数据。
所以不能把这个结果自动付给s1了。需要用强制转换格式s1=(short)(s+1);
作者: 红茶2331    时间: 2013-11-12 21:32
Θ动@咚Θ 发表于 2013-11-12 20:03
计算机运算中有两个规则 1.如s1=1和s1+=1这样的的等号右侧是常数表达式,这时候,可以int32到int16的隐式转换 ...

啊,是会损失精度的,就是这两个规则以前没怎么看过,看过也是模里两可的。
作者: heke    时间: 2013-11-12 22:39
short s1 = 1; s1 = s1 + 1;short是2Byte,1是int类型4Byte,s1+1时会把s1提升为int在赋值给s1就不行了,因为s1是2B装不下,就好比4两饭用2两装,
s1+=1,因为+=是一个赋值符号,里面有强转动作,好比s1=(short) (s1+1)
作者: 不抛弃不放弃    时间: 2013-11-13 01:24
short s1 = 1; s1 = s1 + 1;编译为什么会出错啊?
short s1 = 1; s1 += 1;怎么就可以通过编译呢
第一个为什么会出错呢   楼上的已经解释过了   我想说下第二个
s1+=1 这个为什么会编译通过呢  是因为+=这个复合赋值符,他包含一个隐藏的转型!  ,他不是简单的s1=s1+1的简写。复合赋值表达式会自动的将它们所执行的计算结果转换为其左侧变量的类型。
呵呵 希望对你有所帮助




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