在Java开发过程中,经常会遇到需要强制类型转换的情况。
int a = 754;
byte b = (byte) a;
在这段代码中,int型变量a被强制转换为byte型,由于byte型内存放的数据范围是[-128 - 127],所以在存入 754 这段数字时会丢失部分精度,分析了一番,原理如下:
1.计算机在存储数字时,会将这些数字以二进制的形式存放
754的二进制为:10 1111 0010
2.在754转换为byte型变量时,由于byte型只能存储1字节(8bit)所以会取后8位有效数字
10 1111 0010 ====》 1111 0010
3.取‘1111 0010’ 的反码,按位取反,符号位不变
1000 1101
4.取‘1000 1101’的补码,补码 = 反码 + 1
1000 1101 (反码)+ 0000 0001 = 1000 1110
5.转换为十进制
1000 1110 = -14
所以在int强转byte后,精度缺失的情况下得出的结果为 b = -14
*正数的补码是本身,负数的补码 = 反码 + 1
*在计算机组成原理中,引入原码、反码、补码的原因为
1000 = -0 而 0000 = 0 ,-0和0都是相等的,而在内存这种寸土寸金的地方,每一bit的浪费都是犯法!所以引入反码补码机制,使得1000 = 1111 + 1 由此不难猜出,1000就成功的洗白成了 -8 ,而正数的最大值0111只能表示到7。
在各种数据类型中,经常可以看到负数的个数总是比正数看起来多出1个,底层的原理就是以上。