黑马程序员技术交流社区

标题: 向学长们求教啊! [打印本页]

作者: haitianzhilian    时间: 2014-3-6 09:24
标题: 向学长们求教啊!
小弟刚学java课程,编译
"short s=1;s=s+1;"时
出现错误,这是怎么回事啊?

作者: Aimer_WJY    时间: 2014-3-6 10:15
s 是short类型的 s=s+1;这里的1是整型,字节长度不一样 所以不能相加。
作者: 咖啡@糖豆    时间: 2014-3-6 10:23
  1. public class TestShort
  2. {
  3. public static void main(String[] args){
  4. short s=1;
  5. s=s+1;
  6. System.out.println(s);
  7. }
  8. }
复制代码


s=s+1这句先执行s+1然后把结果赋给s,由于1为int类型,所以s+1的返回值是int类型,类型转换可由小到大自动转,即byte->short->int->long如果反过来会丢失精度,必须进行显示类型转换,这样写“s+=1”可以,因为+=是操作符,在解析时候s+=1就等价于s = (short)(s+1),属强制转换,希望对你有帮助

作者: sanguodouble1    时间: 2014-3-6 10:52
这是因为你在执行s=s+1;时,进行了向下转型,也就尝试着将int类型转换为short,
而向下转型必须要自己强制转换

原理:byte,short,char互相之间不能转换,需要全部转换为int再计算

然后说下过程吧:
其实他是这样执行的,在执行s+1时,会把s先转化成int类型,然后和1相加,这时的值2也是int类型
然后你尝试着把4个字节的int类型赋值给2个字节的short类型,所以就报错了

修复方法:s = (char)(s+1);

作者: 何伟超    时间: 2014-3-6 19:07
系统默认整数型变量为int。你定义的s是short类型,但是s+1计算时默认结果为int类型。short是不等于int的。所以系统会报错!!!
作者: 山治0712    时间: 2014-3-6 21:04
s是short类型的,加1之后被提升为int类型了,int类型的结果赋给short类型的s肯定不行的,有两种解决,一是将(s+1)强转成short类型--(int)(s+1),二是将s=s+1替换成s+=1
作者: 徐瑶    时间: 2014-3-6 22:18
这是java中数据类型导致的
short s=1;//是给short类型的变量初始化值
s=s+1//
因为1默认为int类型,,所以和short类型的相加就出错了,
可以加上:
short s=1;
s=(short)s+1;
强转为short类型
作者: Aenon    时间: 2014-3-6 23:11
8种基本数据类型,除了boolean之外,从小范围的值到大范围的值可以自动转换,因为不会丢失数据和精度
byte-->short-->int-->long-->float-->double
char-->int-->long-->float-->double
long-->float:可认为float的范围大,对于存储空间而言,存储空间大范围也就大,对于整数是精确存储,
所以整数和存储空间是依依对应的,但是实型数据的存储是近似储存。
虽然能够自动进行,但是这种自动转换比较特殊,它有可能丢掉数据
小范围的到大范围的转换会丢失数据可精度就,这个时候就需要程序员自己考虑是不是要强转。




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