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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© haitianzhilian 中级黑马   /  2014-3-6 09:24  /  1130 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

小弟刚学java课程,编译
"short s=1;s=s+1;"时
出现错误,这是怎么回事啊?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

7 个回复

倒序浏览
s 是short类型的 s=s+1;这里的1是整型,字节长度不一样 所以不能相加。
回复 使用道具 举报
  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),属强制转换,希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报 1 0
这是因为你在执行s=s+1;时,进行了向下转型,也就尝试着将int类型转换为short,
而向下转型必须要自己强制转换

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

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

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

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
系统默认整数型变量为int。你定义的s是short类型,但是s+1计算时默认结果为int类型。short是不等于int的。所以系统会报错!!!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
s是short类型的,加1之后被提升为int类型了,int类型的结果赋给short类型的s肯定不行的,有两种解决,一是将(s+1)强转成short类型--(int)(s+1),二是将s=s+1替换成s+=1

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
这是java中数据类型导致的
short s=1;//是给short类型的变量初始化值
s=s+1//
因为1默认为int类型,,所以和short类型的相加就出错了,
可以加上:
short s=1;
s=(short)s+1;
强转为short类型

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
8种基本数据类型,除了boolean之外,从小范围的值到大范围的值可以自动转换,因为不会丢失数据和精度
byte-->short-->int-->long-->float-->double
char-->int-->long-->float-->double
long-->float:可认为float的范围大,对于存储空间而言,存储空间大范围也就大,对于整数是精确存储,
所以整数和存储空间是依依对应的,但是实型数据的存储是近似储存。
虽然能够自动进行,但是这种自动转换比较特殊,它有可能丢掉数据
小范围的到大范围的转换会丢失数据可精度就,这个时候就需要程序员自己考虑是不是要强转。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

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