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 -> 111111101111110转为10进制为126,加上符号1,表示-126