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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周志伟 黑马帝   /  2013-3-29 19:32  /  1842 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周志伟 于 2013-3-29 20:00 编辑

short s = 4;
s = s + 3;(这句会报错),错误提示如图所示:

s+=3;(这句就不会报错)(为什么呢???)----因为“+=”会做自动转换,而“=”不会。(疑问:short s = 4;既然在java里出现的4默认是int型,那这句赋值语句岂不是把int型的赋值给short型的啦?毕老师又说“=”不会自动转换,执行 short s = 4;这一句应该是错误的啊?因为是把高类型的赋值给了低类型的了。)
System.out.println(s);

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

12 个回复

倒序浏览
byte short 直接赋值是不会报错的,虽然默认值是int  但是 short b = 27; 这样是给short赋值 但是如果是long类型的你必须long a=5L;这样标识
默认int 是  3 + b;
这样3默认的是int  所以运算会出错 不同类型的数值是不可以进行运算的
回复 使用道具 举报

s = s + 3;
先自动将s转化为范围较大的int型,然后和3相加,得到一个int型,再赋给short型变量,范围大的赋给范围小的,编译器不允许这么做。所以报错。

s += 3;
类似于  s = (short)(s+3);

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
执行 short s = 4;与执行s = s + 3;是两个不同的概念,short s = 4是因为4在short类型的范围之内,是个固定的值所以底层自动转换;
而s = s + 3,举个毕老师的例子:
好比两个四两的碗,得到的结果还是四两碗,如果把这四两的碗再交给二两的碗,此时就会装不下,而报错!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
short的最大值是32767,short  s=4;可以直接编译通过,
而short s=4;s=s+3;编译器不会聪明到计算后再去判断s的值,他会认为s原来的值可能是32765之类的,加3后就会超出short范围,所以会报错
对于强转不强转的先不说,根据现实,只要划了等号,左边的就一定要在类型、范围上大于等于右边
回复 使用道具 举报
首先我们来看short s =4;这个变量
它是把4整数赋值给short,在赋值前检查是否超过了short的范围,如果在范围以内就赋值成功,这里是没有问题的.
下面s=s+3;这个变量是s变量跟整数型4进行计算,在计算前s会自动提升为int类型数据,相加完成后以int类型数据
赋值给short s变量肯定是要丢失精度的,因为short占用2个字节,而int是4个字节.
4个字节赋值给2个字节的容器肯定是要丢失精度的.
而s +=3实际是s = s+3的简写,但是运算完成后进行了强制转换成short赋值,所以这里不会报错
如果最后得值超过了short的取值范围,它最后得值也是就是精度的.
希望可以给你带来帮助,如果有不明白的,可以私密我.
回复 使用道具 举报
short s = 4;
s = s + 3;
s+=3;
s为short,3默认为int
你把一个s+3,精度提升为int
然后一个int赋值给short,肯定报错
至于 s+=3不报错是因为+=,他在内部自动转换了类型
s+=3就相当于s=(short)(s+3);
回复 使用道具 举报
周志伟 黑马帝 2013-3-30 23:12:30
8#
似水像火 发表于 2013-3-29 19:53
s = s + 3;
先自动将s转化为范围较大的int型,然后和3相加,得到一个int型,再赋给short型变量,范围大的 ...

明白了,谢谢啦。继续努力中~~~~
回复 使用道具 举报
周志伟 黑马帝 2013-3-30 23:13:25
9#
_王涛 发表于 2013-3-29 19:58
执行 short s = 4;与执行s = s + 3;是两个不同的概念,short s = 4是因为4在short类型的范围之内,是个固定 ...

借用毕老师的话来说明很形象啊,学习了。多谢哈~~
回复 使用道具 举报
周志伟 发表于 2013-3-30 23:13
借用毕老师的话来说明很形象啊,学习了。多谢哈~~

不客气...
回复 使用道具 举报
王亚东 发表于 2013-3-29 19:59
short的最大值是32767,short  s=4;可以直接编译通过,
而short s=4;s=s+3;编译器不会聪明到计算后再去 ...

学习了,呵呵。谢谢啦
回复 使用道具 举报
luguoyuanf 发表于 2013-3-29 23:21
首先我们来看short s =4;这个变量
它是把4整数赋值给short,在赋值前检查是否超过了short的范围,如果在范围 ...

很细致啊。谢谢了
回复 使用道具 举报
疯狂程序 发表于 2013-3-30 00:08
short s = 4;
s = s + 3;
s+=3;

明白了,谢谢啦。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马