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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马连家华 中级黑马   /  2012-2-17 19:50  /  2033 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Noword 于 2012-2-17 23:46 编辑

short s = 5;
s = s + 6;
这两个语句为什么运行时会出错?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

12 个回复

倒序浏览
好像是说6是int,和s运算完后是int值赋给short值的s会丢失精度,
这好像跟C不太一样。。。怎么就知道6是int值?
那怎么样改才会编译通过呢?
回复 使用道具 举报
变量s是short类型,5默认是int,
s+5时   s被提升为int,但提升后的int默认不可以用short装(装不下,int占4个字节,short占2个)
可以强制转换成short,即s = (short)(s + 6);  但这样可能精度丢失

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
唐秀启 + 1
黑马连家华 + 1

查看全部评分

回复 使用道具 举报
在Java中,一个整数默认是int型的,所以 整数6就是int型的
s = s + 6;
是先将参与运算的 s 提升为int 再与6相加,得到的结果是 int型的
所以不能直接赋给左边short型的变量s,应该强制转换为short后再赋值给s,即:
s = (short) (s + 6);

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
唐秀启 + 1
黑马连家华 + 1

查看全部评分

回复 使用道具 举报
那能不能把6定义为short值再与s相加?这样对于这个案例来说得到的结果就不会丢失精度了
回复 使用道具 举报
那能不能把6定义为short值再与s相加?这样对于这个案例来说得到的结果就不会丢失精度了为什么没人回答呢?
回复 使用道具 举报
为什么没人回答呢?在线等真理。。。
回复 使用道具 举报
本帖最后由 pengfangjava 于 2012-2-17 20:54 编辑
Noword 发表于 2012-2-17 20:35
那能不能把6定义为short值再与s相加?这样对于这个案例来说得到的结果就不会丢失精度了为什么没人回答呢? ...


不行的

short a,b,c;
a=1;
b=2;
c=a+b;  // Type mismatch

java默认输入的数字是int类型,将会进行int类型的计算。
因此你在运算完的时候可以强转:
a=1;
b=2;
c=(short)(a+b);
由于long型容量比int还要大,所以给long型变量赋值的时候,java给了一种可以指定类型的赋值,可以写成如下:
long a,b,c;
a=1L;
b=2L
c=a+b;
或者
long a,b,c;
a=1;
b=2;
c=(long)(a+b);
回复 使用道具 举报
刘基军 黑马帝 2012-2-17 20:55:05
9#
本帖最后由 刘基军 于 2012-2-17 20:56 编辑

那样不行的,参考如下规则:
运算时,表达式的数据类型自动提升:
所有的byte型、short型和char的值将被提升到int型。
如果一个操作数是long型,计算结果就是long型;
如果一个操作数是float型,计算结果就是float型;
如果一个操作数是double型,计算结果就是double型。
回复 使用道具 举报
pengfangjava 发表于 2012-2-17 20:51
不行的

short a,b,c;

为什么这样就可以了。。。
short a=2;
a += 3:
回复 使用道具 举报
short s = 5;
s = s + 6;
6是int类型的,s与6相加时,s类型被提升为int,两个int类型相加,赋值给s,此时的等号左边的s是short,会可能丢失精度。如果你可以确定相加的值在short范围内,你可以强制向下转型。
s = (short)(s+5);
回复 使用道具 举报
好吧好吧,日后解决。我学习速度太慢了,现在好困,,,思维跟不上
回复 使用道具 举报
int的精度比short高,所以s+6运行结果的类型为int类型。如要等到short类型,则需要显式类型转换运算:(类型名)要转换的值
即s = (short)(s +6);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马