黑马程序员技术交流社区

标题: 数值类型长度的问题 [打印本页]

作者: 黑马连家华    时间: 2012-2-17 19:50
标题: 数值类型长度的问题
本帖最后由 Noword 于 2012-2-17 23:46 编辑

short s = 5;
s = s + 6;
这两个语句为什么运行时会出错?
作者: 黑马连家华    时间: 2012-2-17 19:53
好像是说6是int,和s运算完后是int值赋给short值的s会丢失精度,
这好像跟C不太一样。。。怎么就知道6是int值?
那怎么样改才会编译通过呢?
作者: 郭繁森    时间: 2012-2-17 19:54
变量s是short类型,5默认是int,
s+5时   s被提升为int,但提升后的int默认不可以用short装(装不下,int占4个字节,short占2个)
可以强制转换成short,即s = (short)(s + 6);  但这样可能精度丢失
作者: 彭小芳    时间: 2012-2-17 19:56
在Java中,一个整数默认是int型的,所以 整数6就是int型的
s = s + 6;
是先将参与运算的 s 提升为int 再与6相加,得到的结果是 int型的
所以不能直接赋给左边short型的变量s,应该强制转换为short后再赋值给s,即:
s = (short) (s + 6);
作者: 黑马连家华    时间: 2012-2-17 19:59
那能不能把6定义为short值再与s相加?这样对于这个案例来说得到的结果就不会丢失精度了
作者: 黑马连家华    时间: 2012-2-17 20:35
那能不能把6定义为short值再与s相加?这样对于这个案例来说得到的结果就不会丢失精度了为什么没人回答呢?
作者: 黑马连家华    时间: 2012-2-17 20:47
为什么没人回答呢?在线等真理。。。

作者: 彭小芳    时间: 2012-2-17 20:51
本帖最后由 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
本帖最后由 刘基军 于 2012-2-17 20:56 编辑

那样不行的,参考如下规则:
运算时,表达式的数据类型自动提升:
所有的byte型、short型和char的值将被提升到int型。
如果一个操作数是long型,计算结果就是long型;
如果一个操作数是float型,计算结果就是float型;
如果一个操作数是double型,计算结果就是double型。

作者: 黑马连家华    时间: 2012-2-17 22:22
pengfangjava 发表于 2012-2-17 20:51
不行的

short a,b,c;

为什么这样就可以了。。。
short a=2;
a += 3:
作者: 黄锦成    时间: 2012-2-17 22:42
short s = 5;
s = s + 6;
6是int类型的,s与6相加时,s类型被提升为int,两个int类型相加,赋值给s,此时的等号左边的s是short,会可能丢失精度。如果你可以确定相加的值在short范围内,你可以强制向下转型。
s = (short)(s+5);
作者: 黑马连家华    时间: 2012-2-17 23:46
好吧好吧,日后解决。我学习速度太慢了,现在好困,,,思维跟不上
作者: 黄奇耀    时间: 2012-2-18 07:40
int的精度比short高,所以s+6运行结果的类型为int类型。如要等到short类型,则需要显式类型转换运算:(类型名)要转换的值
即s = (short)(s +6);




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