java 中精度受损的一种转换计算方式

   背景:

           大家都知道,低精度的数字转换为高精度的数字是没有问题的,但是高精度的数字转换低精度的数字会精度受损。那精度是怎样受损的?转换的逻辑是怎样的了?以下为个人的猜想。
           先上代码,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,需要注意是否进行补码转换。


猜你喜欢

转载自liuwenjie517333.iteye.com/blog/2224883
今日推荐