原码、反码、补码--计算机中为什么使用补码


原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
补码是现代计算机使用的编码格式,解决了反码的两个缺点。正数的补码与原码格式相同,负数的补码是将负数绝对值的原码分别按位取反,并加1,

目录

知识梳理:原码、反码、补码的基础概念
问题一:.为什么有补码?
问题二:.补码中将减法转化为加法后面的数学原理。
问题三: 为什么补码的表示范围比原码的表示范围大一位?
问题四:为什么1000 0000表示 -128?
问题五:为什么在计算补码的时候要取反?还要加一?

二进制定点表示方法。它的表示方法就是最高位表示符号位,1代表负,0代表正。
比如:1(原码)= 0000 0001
-1(原码)= 1000 0001
反码:
定义:正数的反码等于它本身;
负数的反码就是负数的原码在符号位不变的基础上,其余各个位取反;
+1 = 0000 0001(原)= 0000 0001(反)
-1 = 1000 0001(原)= 1111 1110 (反)
补码
定义:正数的补码是它本身;
负数的补码是它的反码再+1;
+1 = 0000 0001(原)= 0000 0001(反)= 0000 0001(补)
-1 = 1000 0001(原)= 1111 1110 (反)= 1111 1111(补)
负数在计算机里面的储存方式一般都是以补码的形式存在的。

https://baike.baidu.com/item/%E5%90%8C%E4%BD%99%E5%AE%9A%E7%90%86/1212360?fr=aladdin
现在有:
-2 ≡ 10 (mod 12 ) = 10
7 ≡ 7 (mod 12)
运用线性运算定理:
7-2 ≡ 7 + 10 (mod) = 5,这里我们就将减法转化为加法了。

问题三: 为什么补码的表示范围比原码的表示范围大一位?
从百度上搜索到的这张图,可以明显的看到,补码的表示范围比原码多了一位,而且是为负数(就是-2^n)。在这里插入图片描述
从图中可以看到,原码之中有两个0的表示方法,一个是+0,另一个是-0,但是到了补码里面,0的表示方法只有一个,也就是说补码取消掉了一个零的表示方式,零的表示方式(1000 0000)也就交给了负数。
问题四:为什么1000 0000表示 -128?
根据问题二还有问题三,我们可以了解到,同余定理还有补码的表示范围比原码还要多出一位,多出来的一位给我了负数,由于原码1000 0000表示128,128和-128 关于模256同余,所以-128和128没有区别,但是在补码里面,符号位1表示负数,所以这里1000 0000表示-128.

问题五:为什么在计算补码的时候要取反?还要加一?

让我们来想想前面说的补码的作用,就是将减法转化为加法,在数学上面就是转化为他的相反数?一个数本身加上相反数会等于多少呢?没错就是0,那么同样的,原码加上他的补码还是会等于0的,比如 0000 0001(1) + 1111 1111(-1) = 0000 0000(0),那么我们就有这一道等式,
对于一个数,补码 + 原码 = 0,补码 = 0 - 原码。
对于0 = 我们上面几行文字说, 0000 0001(1) + 1111 1111(-1) = 0,那么就可以将这一道式子进行等价代换:
对于一个数:补码 = 1111 1111 + 0000 0001 - 原码。
移项后有: 补码 = 1111 1111 - 原码 +0000 0001
对于 1111 1111 - 原码 = ?大家可以自己算算,结果其实是这个数的反码,(反码就是全部取反)
例如:
对于1: 1111 1111 - 0000 0001 = 1111 1110
对于2: 1111 1111 - 0000 0010 = 1111 1101

大家可以自行运算,这就是反码的由来,
补码 = 1111 1111 - 原码 +0000 0001
根据公式,可以写成:
补码 = 反码 (1111 1111 - 原码 )+0000 0001
这就是表示补码的时候,反码还要 + 1 .