背景:
大家都知道,低精度的数字转换为高精度的数字是没有问题的,但是高精度的数字转换低精度的数字会精度受损。那精度是怎样受损的?转换的逻辑是怎样的了?以下为个人的猜想。
先上代码,1个short类型的数字,转换为byte类型的数字
@Test public void LongToInt(){ short c = 428; byte e = (byte)c; System.out.println("c to e :" +e); }
分析:
在计算机内存中,所有的数据都是以二进制方式进行计算的。数字运算也不能列外。就以二进制为思路。
short在java中 占用两个字节,二进制为16位的0和1。
比如:short c = 428 对应的二进制为 0000000110101100。
byte 在java中占用1个字节。
两个字节的short类型转换为1个字节的byte类型,是怎样转换的了?
个人猜想,把short的第一个字节去掉,还剩1个字节,把剩余的字节赋值给byte,那么0000000110101100去掉第一个字节的8位,剩下的字节为10101100,java中又是有符号数,一看最高为1,得用补码计算。最高位不变,其他位0变成1,1变成0,然后再加1,最后的二进制位11010100,最高位表示符号位,不进行计算,剩余的1010100转换为10进制为84,再加上符号位,最后的结果就是 -84了。
总结:
高精度的数字转换为低精度的数,把超过低精度字节的长度,从高精度高位字节去掉,转换为符合低精度的字节长度。
比如8字节的long,转换为4字节的int,把long的前4个字节去掉,剩余4个字节赋值给int,需要注意是否进行补码转换。