目录
二进制运算
计算机中,数值的运算都是用二进制表示的。
一个二进制数中,最高位是符号位,0 为正数,1 为负数。
6 的二进制:0000 0110
8 的二进制:0000 1000
-8 的二进制:1000 1000
如计算: 6 + 8
00000110
+00001000
---------
00001110
得到结果是 0000 1110,也就是十进制的 14。
但是如果计算: 6 + (-8)
00000110
+10001000
---------
10001110
得到的结果是 1000 1110,也就是十进制的 -14, 显然该结果是错误的。
从上面例子看出,如果使用正常的加法规则来运算,正数和正数相加的结果是正确的,而正数和负数相加的结果是错误的。
在计算机中,为了解决正数和负数相加的问题,采用补码来表示负数。
补码的概念
在介绍补码的概念之前,先介绍一下“模”的概念。
假设当前时针指向 8 点,而准确时间是 6 点,调整时间有以下两种拨法:
一种是倒拨 2 小时,8 – 2 = 6 点;
另一种是顺拨 10 小时,8 + 10 = 12 + 6 = (12 + 6 ) % 12 = 6 点;
即 8 – 2 = 8 + 10 = 6 点 。
时钟的“模”是 12,减 2 和 加 10 的效果是一样的,也就是 2 和 10 互为补数。
如果两个数互为补数,那么它们的和正好等于“模”。所以,减法也就可以转成加法运算:
X – Y = X + ( Y 的补数 ) = X + (“模”- Y)
对于计算机,其概念和方法完全一样。n 位计算机,设 n = 8,所能表示的最大数是 1111 1111,若再加 1 成 1 0000 0000 (9位),但因只有 8 位,最高位 1 自然丢失,又回到了 00000000,所以 8 位二进制系统的“模”为 2 的 8 次方。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。
求给定数值的补码分以下两种情况:
正数的补码,与原码相同。
负数的补码,将其原码除符号位外的所有位取反(0 变 1,1 变 0,符号位为 1 不变)后加 1。
8 位计算器的负数的补码计算公式:
1111 1111 – 负数的原码 + 1 = 1 0000 0000 – 负数的原码 = “模”- 负数的原码
如上例子,要计算 6 + (-8),要先得到 -8 的补码,然后 6 加上补码:
-8 的补码:1111 0111 + 1 = 1111 1000
6 加上补码:0000 0110 + 1111 1000 = 1111 1110
结果中第一位是 1,表示这个结果是负数的补码,该补码对应的负数为(先减 1,再取反):
先减 1:1111 1110 – 1 = 1111 1101
再取反:1000 0010(也就是十进制的 -2)
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理,也就是只使用一种加法电路就能完成加法和减法的运算。
证明负数可以用补码表示
证明:X – Y = X + (-Y) 的补码
-Y 的补码:(1111 1111 – Y) + 1
X – Y = X + (-Y)的补码
= X + (111 11111 – Y) + 1
= X – Y + 1 0000 0000
= X – Y + 0000 0000
= X – Y
在 8 位计算机中,1 0000 0000(9位)的最高位 1 需要舍弃,也就是 0000 0000。