黑马程序员技术交流社区

标题: 关于short精度的问题 [打印本页]

作者: 赵倩倩    时间: 2012-7-8 21:06
标题: 关于short精度的问题
这一小段程序 short s1=1; s1=s1+1;就会报错 但是s1+=1;就没有错误  为嘛啊
class Test3
{
        public static void main(String[] args)
        {
                short s1=1;
                s1+=1;
                                System.out.println(s1);
        }
}

作者: 田向向    时间: 2012-7-8 21:12
因为S1是short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。   
     后面的那个不会发生类型的提升,JAVA规范上说 e1+=e2   实际上是  e1=(T1)(e1+e2),其中T1是e1的数据类型。   s1+=1等效于   s1=(short)(s1+1),所以是正确的

毕老师的视频上有具体的讲过这样的例子,,建议你好好看看
作者: 田向向    时间: 2012-7-8 21:13
关于你这个问题的帖子很多啊
作者: 陈冲    时间: 2012-7-8 21:14
  1. class Test3
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 short s1=1;
  6.                 s1+=1;//在这里,数字1是int型,在计算的时候如果使用s1=s1+1,就会自动将s1+1的类型转换为int型,而左值s1为short型,所以会报错;如果想使用
  7.                             //s1=s1+1,应该使用强制转换s1=(short)(s1+1)
  8.                 System.out.println(s1);
  9.         }
  10. }
复制代码

作者: 高原    时间: 2012-7-8 21:32
java中的整数默认都是int型,除非你定义的时候指明其类型
如果超过了int的范围,需要在数字后面加上 (L)
无论short,char,还是 byte,只要和一起int型整数参与运算,就会先转化为int,然后再运算,运算结果还是int
所以 s1 = s1 + 1; 等号右边结果是 int 型,而 等号左边 是 short ,所以要强制转化,即:s1 = (int)(s1+1);
如果是自加运算,则不需要这样的转化,系统会自动帮你完成。
另外,如果运算后超过了原来类型的范围,则会溢出,关于这点,你可以看论坛中其他人的帖子
作者: 冯大卫    时间: 2012-7-8 22:10
对于short s1=1;s1=s1+1;由于s1+1运算时会自动提升表达式的类型,所以会自动提升表达式的类型,所以结果是INT型,在复制给short类型s1时,编译器将报告需要强制转换类型的错误。
short s1=1;s1+=1;由于+=是java语言规定运算符,java编译器会对她进行特殊处理,因此可以编译。
作者: 刘笑    时间: 2012-7-9 13:44
视频里讲过,前者有强制转换,后者则没有,so·····
作者: 赵倩倩    时间: 2012-7-9 13:58
刘笑 发表于 2012-7-9 13:44
视频里讲过,前者有强制转换,后者则没有,so·····

学长 巧
作者: 赵倩倩    时间: 2012-7-9 14:00
赵倩倩 发表于 2012-7-9 13:58
学长 巧

我查过这个 如果+= 执行左操作数  但是左操作数是啥 查不到啊
作者: 刘笑    时间: 2012-7-9 14:03
赵倩倩 发表于 2012-7-9 14:00
我查过这个 如果+= 执行左操作数  但是左操作数是啥 查不到啊

巧?巧啥?
作者: 刘笑    时间: 2012-7-9 14:03
赵倩倩 发表于 2012-7-9 14:00
我查过这个 如果+= 执行左操作数  但是左操作数是啥 查不到啊

看二楼,二楼讲的比较详细
作者: 山水游客    时间: 2012-7-9 17:06
s1=s1+1错了是因为运算从左向右,当遇到1的时候就被自动提升为int类型的数据了;+=是java语言规定运算符,java编译器会对她进行特殊处理,因此可以编译




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