原码,反码与补码理解
1. 写作目的
平时学习总结的学习笔记,方便自己理解加深印象。同时希望可以帮到正在学习这方面知识的同学,可以相互学习。新手上路请多关照,如果问题还请不吝赐教。
2. 前置知识 字节 → 位 → 二进制数
计算机存储数据使用字节进行存储,机器有32位,64位为一个最小存储单元,1个字节为8位,那么32位机器一个存储单元存储4个字节,64位机器一个存储单元为8个字节。计算机使用二进制来表示数据,1位代表一个二进制数,要么是1,要么是0。
3. 引出原码
既然是数据,那么就有大小,就需要对数值进行运算。我们用真值来表示数据的大小,正负。
十进制:+8 = 二进制:+1000
十进制:-6 = 二进制:-0110
+1000,-0110既是真值,但是计算机在存储数据时没有单独存储数值的正负,而是同样用1,0来存储负,正,那么这就是原码表示。
十进制:+8 = 二进制:01000
十进制:-6 = 二进制:10110
表示是没有问题?但是问题又出现了,那就是如果是同符号运算,我们很好算,如果符号不相同的两个数相加,我们首先要判断哪个数更大,然后相减得到结果,再用大数的符号标注,这样每次算更加麻烦。而且计算机没有设计减法运算,只有加法运算,因为加法运算更加快速。我们如何来实现2个数的减法。下面就是加法转减法的思路:
4. 同余模数
以表盘为例:表盘有12个刻度,走完12个刻度后回到原点。如果时针指向3点,我想回拨到2点,那么我的方法有,① 直接回拨一个刻度,② 向前拨11个刻度。方法 ① 很好理解,为什么方法 ② 同样可以,明明是向前拨也达到了同样的效果,12就是模,当拨够了12个刻度,就舍去了12,也就是舍去了模。3+11 = 14,14 - 12 = 2,所有同样是2点。在这里 1 ≡ 11是同于模数,模为12。 又因为 1 ≡ 13 ≡ 25,所以正数的同于模数就是它本身。这些都有相应的计算同余模数的公式 。
有了以上的知识,我们就能往下继续了。我们可以应用同余模数来把加法变成减法,比如:
01000 - 00010;我们需要把 减 00010 变为 加上一个数,那么加上数即为这个数的同余模数。按照上边的公式,同余模数 = $2^4+1$ - 00010 = 100000 - 00010 = 11111 + 00001 - 00010 = 11111 - 00010 + 00001 = (1 x1x2x3x4)+ 00001。 通过变形,我们发现如果想要求得负数的同余模数,我们只需要保证这个数的符号位不变,其他位取相反数(因为1减去一个数,可以看成是求这个数的相反数),最后+1,即可。
5. 重点来了
有了这个规律,我们就引出了反码,补码。反码就是原码符号位不变,其它位取反,他就是我们通向补码的中间产物。那么我们的补码就是我们的同余模数,加减运算使用补码完成。小弟不才,原码,反码,补码的来龙去脉我目前只能理解到这样的程度。
6. 画龙点睛
真值为0时: +0000,-0000,有2中表现形式;
原码: 00000, 10000,有2中形式;
反码: 00000, 11111,有2中形式;
补码: 00000,10,0000(0,0000) 一种形式。
我们看出 原码有2个0,反码有2个0,补码只有一个0。
参考文档:
《计算机组成原理第二版-唐朔飞》
来源:https://www.cnblogs.com/timestore/p/11159303.html