计算机中数字默认为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);