File tree 1 file changed +7
-3
lines changed
1 file changed +7
-3
lines changed Original file line number Diff line number Diff line change 42
42
43
43
所以 4 + (- 2)= 4 + 14 = 2。
44
44
45
- 我们利用同余的性质,把减法成功转换成了加法,所以我们只需要在计算机里边将 -2 存成 8 就行了。我们这里减去 2 就等价于加上 14。
45
+ 我们利用同余的性质,把减法成功转换成了加法,所以我们只需要在计算机里边将 -2 存成 14 就行了。我们这里减去 2 就等价于加上 14。
46
46
47
47
再比如 13 - 7 ,也就是 13 + (-7)
48
48
90
90
91
91
我们可以看到 1101 + 1110 本来等于 1 1011 ,因为只存储 4 位,所以最高位被丢掉了,其实这就进行了取模的操作,减去了 16 。如果我们看所对应的十进制是怎么操作的, 1101 表示 13,1110 表示 14 ,13 + 14 = 27 ,如果是模 16 操作下,就是 11 ,而 11 就是上边的结果 1011,看表格它代表的数是 - 5,- 3 - 2 = - 5 ,没毛病。
92
92
93
- 而且我们发现用这种表示方式,所有的正数首位都是 0 ,负数的首位都是 1 ,这一定不是巧合。按我的理解,因为我们要保证正数和他的相反数相加等于 0000 ,如果首位是相同的,那么该位相加一定会是 0 (0 + 0 = 0,1 + 1 = 0,因为高位被丢掉了),假如 0010 的相反数是 0xxx,为了使得后三位相加等于 0 ,一定得产生进位才能实现(不产生进位,我们无法把 0010 中的 1 变成 0),如果产生了进位,那么首位就变成了 1,它的和就变成了 1000 ,不是 0000,产生矛盾。所以正数和负数的首位一定相反,我们可以把它看做符号位。即首位是 0 就是正数,首位是 1 就是负数。
93
+ 而且我们发现用这种表示方式,所有的正数首位都是 0 ,负数的首位都是 1 ,我们可以这样想。
94
+
95
+ 假设正数和负数的首位相同,假如首位都是 0。
96
+
97
+ 那么比如 a = 0010 这个正数,如果我们去找它的相反数 b,也就是对应的负数。由假设可以知道,它的相反数的最高位也是 0。即 0xxx 的形式。为了使得 a 和它的相反数相加等于 0,我们必须使得相反数 b 的第 3 位是 1,即 0x10,才能使得第 3 位的和是 0。但这样的话,第 3 位产生了进位, b 的第 2 位也得是 1,所以 b 就成了 0110,但这样虽然使得最后 3 位的和变成了 0,但是第 1 位我们假设了它是 0,由于第 2 位产生的进位,这样 a 和 b 相加不是 0 了,产生矛盾。所以假设不成立。所以正数和负数的首位一定不同,如果首位 0 代表正数,那么负数的首位一定是 1。
94
98
95
99
接下来的问题,给出一个数我们总不能查表去看它的补码吧,我们如何得出补码?
96
100
104
108
105
109
我们来求 - 2 的补码,用 16 - 2 = 1 0000 - 0010 = ( 1111 + 1 ) - 0010 = ( 1111 - 0010 ) + 1 = 1101 + 1 = 1110 。
106
110
107
- 为什么转换成 1111 减去一个数,因为用 1111 减去一个数,虽然是减法,但其实只要把这个数按位求反即可。也就是 0010 按位求反变成 1101,再加上 1 就是它的补码了 ,「按位取反,末位加 1 」这个口诀是不是很熟悉,哈哈,这就是快速求补码的法则。但我们不要忘了它的本质,其实是用模长减去它,但是计算机并不会减法,而是巧妙的转换到了取反再加 1 。
111
+ 为什么转换成 1111 减去一个数,因为用 1111 减去一个数,虽然是减法,但其实只要把这个数按位求反即可。也就是把 2, 0010 按位求反变成 1101,再加上 1 就是 -2 的补码形式了 ,「按位取反,末位加 1 」这个口诀是不是很熟悉,哈哈,这就是快速求补码的法则。但我们不要忘了它的本质,其实是用模长减去它,但是计算机并不会减法,而是巧妙的转换到了取反再加 1 。
108
112
109
113
逆过程呢?如果我们知道了计算机存了个数 1110,那么它代表多少呢?首先首位是 1 ,它一定是一个负数,其次它是怎么得来的呢?往上翻,其实是用 16 - 2 =1110 得到的,我们现在是准备求 2 ,用 16 减去它就可以了,也就是 16 - 1110 = 1 0000 - 1110 = (1111 + 1)- 1110 = (1111 - 1110) + 1 = 0010。巧了,依旧是按位取反,末位加 1。而 0010 就是 2,所以 1110 就代表 - 2。
110
114
You can’t perform that action at this time.
0 commit comments