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

© 伯爵公子 中级黑马   /  2015-7-18 09:44  /  1813 人查看  /  30 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class OperatorDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 short s = 3;
  6.                 s += 4;
  7.                 System.out.println("s= "+ s);// s =7
  8.         }
  9. }
复制代码

说明:在执行s+=4;语句时,编译器在编译的时候,默认进行了强制类型转换,也就是将int类型的数据类型转换成short类型的数据。

  1. class OperatorDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 short s = 3;
  6.                 s = s + 4;//报错
  7.                 System.out.println("s= "+ s);
  8.         }
  9. }
复制代码

说明:在执行s=s+4;语句时,编译器在进行编译的时候,默认并没有强制类型转换。所以,s是short类型,4是int类型,s会自动提升为int类型,相加的和也是int类型,赋值给short类型的变量肯定会损失精度。报错,可以通过强制类型转换解决问题:s=(short)(s+4);

30 个回复

正序浏览

你的技术分也差不多了,进行到哪一步了?
回复 使用道具 举报
wrnlksblk 发表于 2015-7-19 11:44
如果类型都是一样的话,那输出结果应该一样吧??

类型一样的话,结果没区别。
回复 使用道具 举报
差不多冬至 发表于 2015-7-19 12:12
+=就是多了一个隐形的强制转换

是呀,像这样的特例,java里面真不少
回复 使用道具 举报
分析的不错
回复 使用道具 举报
分析的不错
回复 使用道具 举报
前者有强制转换,后者没有
回复 使用道具 举报
+=进行了内部强制转换
回复 使用道具 举报
定一个!!
回复 使用道具 举报
伯爵公子 发表于 2015-7-19 10:24
谢谢顶一个,你的技术分都够了,你面试了吗?

还没有提交自荐信
回复 使用道具 举报
说的很相信 很好
回复 使用道具 举报
Wqi 高级黑马 2015-7-19 13:09:17
21#
伯爵公子 发表于 2015-7-19 10:31
分析的很清晰,你的日记写到哪一步了?

才写到面向对象。。。。等面向对象这章学完再整理下
回复 使用道具 举报
+=就是多了一个隐形的强制转换
回复 使用道具 举报
Wqi 发表于 2015-7-18 14:38
+=是赋值运算,一次运算,而且会自动匹配范围。     s=s+4这是2次运算,先计算s+4,然后赋值给s,如果s的数 ...

如果类型都是一样的话,那输出结果应该一样吧??
回复 使用道具 举报
顶一个!!
回复 使用道具 举报

顶一个!
回复 使用道具 举报
Wqi 发表于 2015-7-18 14:38
+=是赋值运算,一次运算,而且会自动匹配范围。     s=s+4这是2次运算,先计算s+4,然后赋值给s,如果s的数 ...

分析的很清晰,你的日记写到哪一步了?
回复 使用道具 举报
gaoming971366 发表于 2015-7-18 14:29
恩,这个确实是这样,我看过一个面试就有一个这样,这是个技术问题,顶楼上 ...

希望面试遇到这个问题,哈哈
回复 使用道具 举报
野驴少东 发表于 2015-7-18 14:08
short s = 3;
                s += 4;
                System.out.println("s= "+ s);// s =7

+=是JVM识别的强制类型转换,不过我没验证过溢出,感谢你的验证
回复 使用道具 举报

是呀,short 和 int 一个16位一个32位。转换的时候有精度问题产生
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马