现实生活中,我们通常使用10进制来表示我们的数字,而在计算机中使用的是“0”和“1”表示数字的二进制。
如果我们用一个字节来存储一个数字,那么这个数字在计算机中的存储形式可能是这样的:00010011。最左边的0位在带符号数字中用来表示正负号,0代表正号,1代表负号,所以它也就叫做符号位;其他位数用来表示具体数字,因此叫做数值位。
00010011如果用来表示带符号整数,那么它代表的数字是+19。+19叫做真值,00010011用于在计算机中表示,所以叫做机器数。
机器数在计算机中的表示形式有三种,原码,反码和补码。
原码的表示:
左边是符号位,正数为0,负数为1。其他位表示数值
【+10】原码 = 00001010
【-10】原码 = 10001010
【+0】原码 = 00000000
【-0】原码 = 10000000
反码的表示:
正数的反码和原码相同,负数的反码由原码除了符号位的其余位取反(即0表1,1表0)
【+10】反码 = 00001010
【-10】反码 = 11110101
【+0】反码 = 00000000
【-0】反码 = 11111111
补码的表示:
正数的补码与原码相同,负数的补码由原码的反码加1得到
【+10】补码 = 00001010
【-10】补码 = 【-10】反码 + 1 = 11110101 + 1 = 11110110
【+0】补码 = 00000000
【-0】补码 = 【-0】反码 + 1 = 11111111 + 1 = 【1】00000000(mod(256))
补码的意义:补码实际上是一种模运算,以时钟为例,时钟一圈是12个小时,即时钟的模为12。如果当前时刻是3点钟,在12个小时之后时刻变为15点,15在模12之后,依然是3点。再如,将3点的时针调慢一个小时,即调成2点,和将时针向前调整11个小时的效果是一样的。因此用3-1和(3+11)mod(12)的结果一样。补码在机器码中的运用主要是用加法元算代替减法运算。CPU的加法器简单效率高,因此不需要再专门实现减法器。
在8位字中,我们的模就是2的8次方,即256。例如:
直接减法:01000000(64)— 00001010(10) = 00110110(54)
用补码代替减法:01000000(64)+(11110110)(246)= 00110110(54)
两种运算结果是一样的。