JAVA强制类型转换的计算规则,这最后为什么是-112
byte z=0;
z +=128;//等同于:z=(byte)z+128;
System.out.println(z);//-128【损失精度】
z += 10000;//等同于:z=(byte)(z+10000);
System.out.println(z);//-112
因为z是byte,加再大的数也只相当于加该数二进制的后8位,z+=128等于加1000 0000,加10000等于加0001 0000,所以z最后是1001 0000,按照补码规则,一个8bit补码的值为(-1)*2^7+2^4=-128+16=-112
z +=128;//等同于:z=(byte)z+128;
这句不对,应该等价于:
z=(byte)((int)z+128);
java计算的时候会发生自动类型转换,将z转换为int类型,128默认就是int,然后int和int相加得到128,再强制转换为byte,由于byte所能表示的最大正数是127,如果128的话就产生溢出了,符号位就是1,所表示的是-128
你看下面这种写法就会报语法错误: