前言
大学学计算机组成的时候,其实并没有对补码有过多的理解。只是会计算就行,像什么“负数的补码”,“正数的补码就是本身”。但是对其中的原理并不了解,下面就记录一下最近重新复习补码得到的心得体会
补数的概念
我们学过补角,比如在180°的角度范围内,20°和160°互为补角,这里的补角就是说两个角度互补,两个角度之和为180°。那么补数呢,其实大同小异。我们以一个时钟作为例子,我们知道时钟有12个刻度,以顺时针方向为正。假如现在是3点,那么时针回拨2个小时是几点呢?如果时针前进10个小时又是几点呢?其实我们可以发现都是1点。刚刚说了我们以顺时针方向为正,那么回拨2个小时可以记为-2,前进10个小时可以记为+10,这时我们可以说-2和+10就是一对互补数。为什么3-2和3+10都等于1呢,这时我们就可以引出度(或者说为模)。
模的概念
上面的时针其实就是一个模为12的转盘,只能装1-12个数,超过12之后就会被重新来一个循环,就是像1、2、3...、12;1、2、3.....。那么我们就说12就是这个时钟的模,就是这个规则所能约束的集合容量。
计算机中的补码
以4个比特位的数据长度举例。我们知道4位二进制数能够表示0-15的十进制数。
二进制 | 十进制 | 二进制 | 十进制 |
---|---|---|---|
0000 | 0 | 0001 | 1 |
0010 | 2 | 0011 | 3 |
0100 | 4 | 0101 | 5 |
0110 | 6 | 0111 | 7 |
1000 | 8 | 1001 | 9 |
1010 | 10 | 1011 | 11 |
1100 | 12 | 1101 | 13 |
1110 | 14 | 1111 | 15 |
如上表所示,我们将其画成一个转盘。
\
这时我们就可以将其类比为时钟,这也是一个模系统,只不过模的值为16,其可表示的值为0-15。我们为了表示负数,人为定义首位为正负值,为0时代表为正数,为1代表为负数。所以这个图也可表示-8-+7的范围,这样就构成了能代表正负数的补码编码。
补码和真值的转换
正数的补码:本身 负数的补码:模-负数的绝对值,也可以将负数绝对值取反然后加1,也可以反码除符号位其余取反加1 补码的真值:首位表示符号位,其余位代表数值位,直接按权展开即可
总结
补码的一些知识点以及理解如上所述,不知道是否阐述清楚,其实我们不必将补码想的那么高深,本质上就是补数,当我们理解了补数,补码自然而然就会了。要理解容量的概念,计算机的字长是有限度的,超出之后只能被舍弃,因此就会形成一个循环的数轴,就导致了模的出现。首先理解无符号数的补码,再去思考有符号的数怎们办,本质上这种区别只是认为规定,计算机是不知道的,他还是按照无符号数一样去计算,这时理解有符号数补码的重要点。