黑马程序员技术交流社区

标题: 一个奇怪的小问题 [打印本页]

作者: 徐强    时间: 2012-11-1 22:49
标题: 一个奇怪的小问题
本帖最后由 徐强 于 2012-11-1 23:11 编辑

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

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

作者: 黑马贾林栋    时间: 2012-11-1 22:55
short j = i +(short)5   
i会默认转化成int型进行计算,再赋值给short型的变量j,可能会损失精度,所以编译会报错
作者: 种生祥    时间: 2012-11-1 22:55
损失精度
short j = short(i+5);
就可以了
作者: 付维翔    时间: 2012-11-1 23:01
兄弟,第一个通过了编译,因为你使用了强制类型转换,当然会编译通过。第二个不能通过是因为,两个short类型的数据相加,得到到是一个Int类型的数据,你当然不能把一个int类型的数据赋值给short类型的变量,以下两种方式都可:short j = (short) (i + (short) 5);  int m = i + (short) 5; 再说一包,short、byte等之类的类型执行算术操作都自动先转换成int型再进行算术运算,结果必然是个int类型的数据
作者: 付维翔    时间: 2012-11-1 23:03
黑马贾林栋 发表于 2012-11-1 22:55
short j = i +(short)5   
i会默认转化成int型进行计算,再赋值给short型的变量j,可能会损失精度,所以编 ...

是因为,两者相加后是一个int类型的数据,所以不能赋值给short类型的变量
作者: 深井看海    时间: 2012-11-3 21:02
用空间转换思考,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);




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