运算细节

来源:互联网 发布:4g那家网络制式好 编辑:程序博客网 时间:2024/06/07 04:01

     计算机中数字默认为int,一个int在java中占4个byte,一个byte ,8个bit,所以在java中一个整数占32个bit,即32个二进制数

    

   接下来写几个容易出错的小片段:

                   byte b=3;   byte b1=3;   byte b2=7;   
                   b=b1+b2; //这一行会编译错误,会丢失进度
                   b=3+7; //这就不会编译错误       System.out.println(b);
  
 出现上述现象的原因是:java中所有整数默认都是int ,所以第一行 byte b=3;java底层就进行了强制类型转换,将int->byte,在转换之前,编译器会先判断3是否在-127-128区间范围内,如果在就能转换成功,否则会转换不成功,编译报错,b1,b2也是同理,

在 b=b1+b2;这里因为b1,b2是变量,变量可理解为变化的量,编译器无法判断大小,所以在这里,编译器要将b1+b2的值赋给b,

但是因为无法判断值得大小,所以无法完成赋值。

     b=3+7;编译通过,因为3,7是常量,这里编译器完成运算,判断3+7在区间-127-128之间,所以完成赋值,

举个例:byte b=3; 

              byte b1=127;

              byte b2=3; 

              b=b1+b2;

这里就超出byte的范围了,所以这就是损失精度的原因了。

                   int i=3;   int x=3;   int y=4;   i=x+y;   System.out.println(i);
  在java中所有整数都默认为了int类型,所有运算结果都默认为int ,所以在这里int 类型付给int类型无需判断了,直接赋值

但是在这里依然可能损失进度如下:

                  int i=3;   int x=Integer.MAX_VALUE;   int y=4;   i=x+y;   System.out.println(i);  //运算结果是:-2147483645
 
  为什么两个正数相加会得负数呢?因为int在java中占32位,x+y;超过int所能表示的最大范围,这里+4后,结果进一位得到33位数,但是在这里java中只能占32位,所以会舍弃1位,然后结果的值的二进制的第一位就为1;1在二进制中表示负数,所以在这里我们得到的结果是负数。

  区别i++,++i

   

                    int a=1;    int b=a++;    System.out.println(a);  //2    System.out.println(b); //1

      

                    int a=1;    int b=++a;    System.out.println(a); //2    System.out.println(b);//2
  这个我解释的不太清楚,不过很容易记忆a++先赋值再自增,++a先运算再自增。a++,在底层应该是先将a=1的值开辟一个临时空间存起来,然后完成自增动作,然后再将1的值赋给b,所以就是如上结果了,++a,++在前,先完成自增,所以就是2,2


                     short s=1;      s+=3; 
                     s=s+3;//会编译错误:丢失精度    System.out.println(s);
   这个跟byte相加的情况相识,s=s+3;因为s是变量,编译器无法判断数值大小,所以无法完成赋值动作,而s+=3;在底层已经完成了自动类型转换,已经检查过数值大小,所以在一定程度上s+=3,不等于s=s+3;

   s+=3;相当于(short)(s+3);