java中的精度损失
请预备知识:二进制与十进制的转换
代码如下:将 int 强转成 byte
byte b = (byte)322;
System.out.println(b);//66
传统计算机底层只能识别二进制,存储和读取数据时都要使用二进制数表示。
强制把int类型转成byte类型,int类型是4个字节32位,用这32位表示322,即00000000 00000000 00000001 01000010
,现在要转成只能装下一个字节的byte,只能把前面24位截掉成01000010
,表示的数即66;
以下只以一个字节为例,多了就截掉
表示正负数
采用最高位是符号位的方法来区分正负数,正数的符号位为0、负数的符号位为1。
byte b = (byte)130;
00000000 00000000 00000000 10000010
符号位是0,表示正的130;把前面截掉成10000010
,最高位是符号位1,即负数,所以是 -2?(二进制的10代表十进制的2)
其实计算机存储数据时,一律储存二进制的补码形式
对于正整数来说,原码、反码、补码相同,对于负数来说,反码:符号位不变,其它位取反;补码:反码+1;以 -1 的补码为例:
byte b = -1;
二进制原码:10000001
反码:符号位不变,其它位取反,11111110
补码:反码+1,11111111
补码转回原码:反推或正推都行
反推:
补码:11111111
反码:补码-1,11111110
原码:10000001
正推:
原码:11111111
反码:10000000
补码:10000001
通过正数的三码合一得知,正数的补码的首位只能是0,所以判断出
10000010
其实是负数的补码,需要推出原码才能算出结果。
正推-> 11111101
-> 11111110
,1111110
转为10进制为126,加上符号1
,表示-126