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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张俊飞 中级黑马   /  2014-1-3 23:18  /  1987 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张俊飞 于 2014-1-5 15:06 编辑

short s = 1; s = s + 1;为什么会出现错误

11 个回复

倒序浏览
short s = 1; s = s + 1;//这是类型转换问题,s是short类型 1在运算时默认是int类型,所以会报错。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 未来希望 于 2014-1-4 00:04 编辑

类型不一致 ,short s = 1;
s = (short) (s + 1);这样就可以了


评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
s是short类型 1在运算时默认是int类型改成s = (short) (s + 1),就可以了
回复 使用道具 举报
本帖最后由 其LovE斤 于 2014-1-4 09:02 编辑

short s = 1; s = s + 1;
s = 1.这里的1 也是int类型的。编译器只要看到整数,就默认是int类型的。
首相1是常量,编译器会看“=”号右边的类型和左边是否存在转换的可能。这里可以转换
然后看“=”右边的数据是否在  左边类型的范围内,这里在。
编译器就会做一个自动转换动作,将1转换为short类型。
s = s + 1   
这里编译器会做两步操作
s+1.   1是int类型的,会将s自动向上提升,变为int型和 1相加
s = s + 1   
   但是 “=”右边的s是一个变量,它存的是内存地址。指向的是一片内存空间。不会判断是否存在转换可能。“=”右边是int  左边是 short。      int占4个字节  short占2个字节。左边放不下。报错,数据精度丢失。具体解决就是上面说的 强转            

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
在运算时 1 是int类型的,s是short类型的,直接进行加法运算时,需要需要把1强转为short类型的
即:s = (short)(s + 1);
用+=这个运算符时不需要强转,因为它会进行自动类型转换,即:s += 1;//是不会出现失去精度的
回复 使用道具 举报
XiaoS 来自手机 中级黑马 2014-1-4 11:53:48
7#
这是数据类型转换的问题。byte,short,char这三种数据类型的变量只要参与运算,就会自动提升为int型然后再参与运算;s=s+1表达式右边b是byte型变量,1默认也是int型,b+1的结果自然也是int型,但是b是个变量,它在参与加法运算时容易丢失精读,将右侧赋值给左边,就是说用int型给byte型赋值,必须进行强制类型转换,改成b=(byte)(b+1)或者写成b+=1(说明:“+=”运算符本身就有强制转换的操作)就不会出错了。
回复 使用道具 举报
XiaoS 来自手机 中级黑马 2014-1-4 11:55:14
8#
,这是数据类型转换的问题。byte,short,char这三种数据类型的变量只要参与运算,就会自动提升为int型然后再参与运算;s=s+1表达式右边b是byte型变量,1默认也是int型,b+1的结果自然也是int型,但是b是个变量,它在参与加法运算时容易丢失精读,将右侧赋值给左边,就是说用int型给byte型赋值,必须进行强制类型转换,改成b=(byte)(b+1)或者写成b+=1(说明:“+=”运算符本身就有强制转换的操作)就不会出错了。
回复 使用道具 举报
XiaoS 来自手机 中级黑马 2014-1-4 11:57:26
9#
不好意思,上面回复中的b写错了,应该是s

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
这个明显是类型不匹配,出现了转换额异常
回复 使用道具 举报
lwx 中级黑马 2014-1-4 17:15:45
11#
俩个值类型不同,需进行强制转换
回复 使用道具 举报
在运算的时候,默认为int型.
所以会报错.
想要运算,需要强转

short s = 1; s = s + 1;
把s=s+1;改为s+=1;就不会报错,因为+=内含有强转的意思
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马