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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 白羽蘇芳 于 2015-7-22 10:22 编辑
  1. class VarDemo
  2. {
  3.     public static void main(String[] args)
  4.         {
  5.         short s=1;
  6.         System.out.println(s);
  7.     }
  8. }
复制代码
1默认不是int么  占4个字节 ,赋值给就占2个字节的s  为啥编译不报错呢?

14 个回复

倒序浏览
底层有强制类型转换,Java 编程思想这一书对这些讲解非常清楚。你试一试超出范围他能 能变异通过吗。
回复 使用道具 举报
masai158 发表于 2015-7-16 11:35
底层有强制类型转换,Java 编程思想这一书对这些讲解非常清楚。你试一试超出范围他能 能变异通过吗。 ...

我以为类型转换只能升不能降啊   
你的意思是说虽然位数超了,但只要数的大小范围在short内,也可以int自动降到short,但是我赋个40000给short就不行了  
是这样么
回复 使用道具 举报
是的。超出范围就会报错。
没有超出范围 则将 Int 强制向下转换。
回复 使用道具 举报
1的范围在short范围内
回复 使用道具 举报
这个在short s=1的时候,java会判断1在short中,这个是一次运算,赋值运算。跟short s=1,s = s+1是不一样的,这里的s=s+1是两次运算,所以会出现。这个在基础视频类型转换有提过的,楼主可以再去看看。本人表达能力不好,望见谅。
回复 使用道具 举报
short s=1;//这是一个赋值的动作,他会先判断这个值的在不在short的范围,如果在就直接赋值,这是对的。
回复 使用道具 举报
shor s=1;
s=s+1;//这样就会报错,因为他先做运算在赋值,运算时会s会提升为int,再去加1,结果为int 在赋值给short的就溢出;
s+=1;//这样写就好了,因为他是把左右2边赋值个s,底层有一个自动转型,可以理解为s=short(s+1)
回复 使用道具 举报
_Rain 来自手机 中级黑马 2015-7-17 01:51:07
9#
常量在进行赋值的时候,虚拟机会自动判断该常量是否能被该类型变量所接收,如果能就不会报错。你可以试试给个超过short范围的常量,编译就会出错。变量的话就必须进行强转!
回复 使用道具 举报
因为是向下强制转换而来的
回复 使用道具 举报
看评论学习,,这点东西差点忘了
回复 使用道具 举报
Leaos 初级黑马 2015-7-17 12:31:46
12#
在给变量显示赋值的时候,只要数值在数据类型的范围内就不会报错了啊
回复 使用道具 举报
1在short 的范围之内  ,直接赋初值就可以。
回复 使用道具 举报
领教了,看来得多学底层的东西
回复 使用道具 举报
刚学过不久,好像是因为1是常量,而且又在short的取值范围内,JVM在编译时会进行内部强制转换。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马