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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐强 中级黑马   /  2012-11-1 22:49  /  1637 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐强 于 2012-11-1 23:11 编辑

今天晚上发现一个奇怪的问题,没弄明白是为什么大家来看看哈,

short k = (short)5;//能通过编译
short  i = 0 ; short j = i +(short)5 //这就不能通过编译,这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
邓艳秋 + 1

查看全部评分

5 个回复

倒序浏览
short j = i +(short)5   
i会默认转化成int型进行计算,再赋值给short型的变量j,可能会损失精度,所以编译会报错

评分

参与人数 1技术分 +1 收起 理由
邓艳秋 + 1

查看全部评分

回复 使用道具 举报
损失精度
short j = short(i+5);
就可以了

评分

参与人数 1技术分 +1 收起 理由
邓艳秋 + 1

查看全部评分

回复 使用道具 举报
兄弟,第一个通过了编译,因为你使用了强制类型转换,当然会编译通过。第二个不能通过是因为,两个short类型的数据相加,得到到是一个Int类型的数据,你当然不能把一个int类型的数据赋值给short类型的变量,以下两种方式都可:short j = (short) (i + (short) 5);  int m = i + (short) 5; 再说一包,short、byte等之类的类型执行算术操作都自动先转换成int型再进行算术运算,结果必然是个int类型的数据

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
黑马贾林栋 发表于 2012-11-1 22:55
short j = i +(short)5   
i会默认转化成int型进行计算,再赋值给short型的变量j,可能会损失精度,所以编 ...

是因为,两者相加后是一个int类型的数据,所以不能赋值给short类型的变量

评分

参与人数 1技术分 +1 收起 理由
邓艳秋 + 1

查看全部评分

回复 使用道具 举报
用空间转换思考,short k = (short)5;//(栈)内存中开辟一个空间是装short型的变量k,把short类型的值5存放进k里,这一系列的操作JVM(JAVA虚拟机)很明白你是要把short类型的值5 存放进short类型的空间里;
short  i = 0 ; short j = i +(short)5 //(栈)内存中开辟两个空间,一个是装short类型的变量i,把0放进i里,JVM知道0在short类型取值范围(-128~127)里,所以会把0当作short类型值来存放;一个是装short类型的变量j,而j的右边是要进行运算的,所以你可以理解为把右边的变量l的两个值都取出来放到另一个临时的空间进行运算,他们运算完之后的结果是5,而5被jvm默认为int类型的值,所以你必须要对这个值进行强制转换,其写法就为short j =short(i+k);

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马