首页 > 编程知识 正文

原码、反码、补码,计算机原码补码反码

时间:2023-05-06 11:15:02 阅读:39587 作者:4284

1 .据了解,前言现代计算机主要由数字集成电路组成,数字电路在高低电平上只能表达为0和1,因此计算机只能识别0和1。 无论是存储还是计算,计算机都在二进制系统中进行。 例如,十进制5用二进制表示为101。

机器数

在计算机上的二进制表示被称为“机器数”。 机器的数量有两个特点:

1、机器数量有符号,也就是说分为正负两部分。 最高位0表示正数,1表示负数。

二、二进制位数由设备限制,字长为8位,称为1字节,机器字长为正常字节的整数倍,例如32位、64位。

例如,机器字长为8时,10进制的5个机器数表示为00000101,-5个机器数表示为10000101。

真值

机器数量的格式值不等于真值,因为第一位是符号位。 例如,在上述的10000101的情况下,真值为-5,但二进制形式的值为133。 因此,将与带符号位的设备数相对应的真数值称为设备数的真值。

2 .原码反码补全的概念计算机直接使用二进制就好了,为什么要区分原码、反码、补全码呢? 在探索这个问题之前,请不要着急,先理解那些概念和计算规则。

1、原码:符号位真值的绝对值。

5=00000101 (原)-5=10000101 (原) 2、反转:正数反转是本身; 负数的反码除了符号比特以外,剩下的比特取反。

5=00000101 (反)-5=11111010 (反) 3、补数:正数补数本身; 负数的补数是其反码1。

5=00000101 (补码)-5=11111011 (补码)3.既然进化过程中已经有了原码,为什么还要使用反码和补码呢? 不是多管闲事了吗? 不!

对于计算机来说,实现加法器比较简单,相反减法器有点复杂,需要考虑借位等逻辑。 早期的计算机有减法器,但后来效率太低,渐渐淘汰了。 是否可以设计允许符号位也直接参与运算的编码? 这样,只需加法器就可以同时完成加减法计算,电路设计更加简单高效。

3.1源代码缺陷直接使用源代码进行运算。 关于加法没有问题。 例如,5(5=10 )。

0000101 (原) 0000101 (原)原)=00001010=10D原码的最大问题是不能将减法转换为加法。 例如,3-2是通过计算3(-2 )得到的结果。 源代码的计算结果为-5,明显错误。

00000011 (原) 10000010 (原)=10000101 (原) )=-5D 3.2反转瑕疵反转代码的出现,正好弥补了原码不能执行减法运算的问题,反转运算减法的规则: a-b=a ()

还是取上面3-2的例子,反码的计算过程如下,最终结果为1。

00000011 (反) 11111101 (反)=10000001 (最高位溢出)=1D反码的计算结果正确,但算法规则稍复杂,需要考虑最高位溢出情况,效率较低。 另外,也有0有两种符号的瑕疵。

以1-1为例,反码的计算过程如下,结果为-0。 实际上是0。 在反码中,发现00000000和11111111都表示0,0有两种代码,需要在确定是否为0时确定两种代码。

00000001 (反) 11111110 (反)=11111111 (反)=-0D 3.3补码的完美补码是现代计算机使用的编码格式,同时解决了原码的缺陷和反码的缺陷。

首先,补数可以将减法运算转换为加法运算。 以3-2为例,计算过程如下,结果正确。

00000011 (补码) 11111110 (补码)=10000001 )补码)最高位溢出,原样丢弃=00000001 )补码)=1D其次,0是否没有两种代码? 还是以1-1为例,计算过程如下,0只有一个代码。 那就是00000000000000。00000000代表1,那么11111111代表什么呢? 在这种情况下,由于人为规定为-128D,因此使用补码时,1字节的显示范围为-128D、127],值比反码多1个。

00000001 (补码) 11111111 (补码)=10000000 )补码)将最高位溢出、直接丢弃=00000000以上归纳起来,补码不仅可以将减法转换为加法,而且算法的规则也更简单

反码和补码的计算过程并不复杂,但要理解为什么可以这样计算,就需要了解与之相关的数学知识。

4 .补码奥秘

首先,请知道“型”的概念。 每个计数系统都需要两个参数:容量和精度。 量值是测量计数系统中容量的参数。 以时钟为例,大家假设12为0,时间从0点开始。 指针旋转到11时,再向后旋转12就没有了,再次回到0,新的轮回开始后,12就变成了钟表的模子。

系统也同样,字长为8字节的机器,其最大能表现的值为11111111,其型号为256。

模N加减法

有“模子”

」的前提条件下,当我们要计算减法时,我们其实有两种计算方法。以时钟为例,模M=12时,计算8-6的方式一是将时针正常往回拨6小时,得到2。方式二是将时针往前拨6小时,得到的结果也是2。

于是,我们可以得出这么一条结论,A-B = A+(M-B),+M相当于时针拨了一圈,并不影响结果,但是却可以将减法转换为加法。有的同学可能会有疑问,M-B不还是减法嘛,是的,但是这种减法不需要减法器即可实现。M-B称为-B的补数,计算一个数的补数,并不需要减法。

我们以4比特字长为例,最大值为1111,即模M=16。计算5-3,其实和5+16-3=5+13的结果是一样的。我们发现3和13互为补数,其它补数还有例如2和14、1和15等,我们发现A-B等于A+B的补数,B的补数如何不通过减法快速求得呢?
3的补数由16-3计算而得,我们拆解一下这个公式,16-3=15-3+1,15二进制的表示四个位全是1,1111-0011其实就是0011自身取反得1100,最后再+1得1101=13D就是它的补数。

模N加减法实现了「化减为加」,但是还有个问题,没有区分正负数。人们在计算时是需要考虑正负数的,所以就需要人为的将一部分二进制划分为负数,一部分二进制划分为正数。当模M=16时,根据公式A-B=A+16-B,当A为零点时,-B=16-B,即时针逆时针移动B,也可以由顺时针移动16-B得到。零点A可以是0000到1111中的任意一个数,为了方便计算,人为规定0000为零点,那么0001为+1,1111为-1,1110为-2,以此类推,结果都是符合补码定义的,大家可以算一下。

5. 总结

现代计算机采用数字集成电路搭建,通过高低电平来表示0和1,所以计算机均采用二进制系统完成。二进制只有0和1,无法表示符号,即正负数,因此人们定义了原码,最高位0代表正数,1代表负数。同时,计算机为了简单和高效,只有加法器,没有减法器,原码最大的问题是不能把减法转化为加法,所以有了反码。反码可以「化减为加」,但它的效率不高,需要考虑最高位溢位的情况,算法相对复杂,且0存在两种编码,有一定的瑕疵,最终,才有了现在的补码。补码同时解决了原码和反码的问题,采用模N加减法,不需要考虑最高位溢位的情况,遇到溢位直接丢弃,效率非常高。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。