计算机中的数值存储
机器数和真值
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。
原码、反码、补码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
反码的表示方法是:正数的反码是其本身;的反码是在其原码的基础上, 符号位不变,其余各个位取反。
补码的表示方法是:正数的补码就是其本身;的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。
原码有什么问题(1+(-1)=-2)
如果使用原码进行计算: 1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
问题:计算错误
反码有什么问题(1+(-1)=-0)
如果使用反码进行计算: 1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0 问题:0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。
补码运算
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
补码表示的溢出
由于计算机中的数字用补码表示,例如8bit的byte类型的表示范围为:
[-128, 127]
0 = [0000 0000](补)
-128 = [1000 0000](补)
127 = [0111 1111](补)
当byte类型的变量超上限127时,如:
+128 = -(-128)= 127 + 1 = [1111 1111](补)+ [0000 0001](补) = [1000 0000](补) = -128
+129 = 127 + 2 = [1111 1111](补)+ [0000 0001](补) = [1000 0001](补) = [1111 1111](原) = -127
当byte类型的变量超过下限-128时:
-129 = -128 - 1 = [1000 0000](补) - [0000 0001](补) = [0111 1111](补) = 127
-130 = -128 - 2 = [1000 0000](补) - [0000 0010](补) = [0111 1110](补) = 126