补码、原码、反码怎么发明出来的?怎么记忆?它们的原理、作用和表示方法

补码、原码、反码怎么发明出来的?怎么记忆?它们的原理、作用和表示方法

先看看怎么记忆补码(尤其是负数的补码),以4位机器字长为例,在脑海中想象出一个时钟

二进制补码顺时针递增,这些码表示的十进制真值:正数顺时针递增,负数也顺时针递增的。

即在固定位数下,二进制补码越大,十进制数也越大(除了1000这个分界点)

可以看出,-2的补码=0000-2的补码,每个负数补码都有这样的规律,也很好理解,-2的补码加上2的补码,不就是时钟的一圈吗,这个一圈也称为模,这里的模是10000,只取低四位0000,这种全0的模,减去一个数,相当于全部位按位取反,末位加1。

正数的补码就是真值的二进制码,负数的补码是正数补码全部位按位取反,末位加1。

这是四位的二进制补码,其他位数也是同理。

补码是怎么来的?

计算机存储数据不就是拿来计算的吗,现在面临两个问题,一个是负数在计算机中的存储问题,我们知道正数可以直接转成二进制码存储,那负数带个负号呢?我们用一个码来存储负数必须要保证它能正确参与运算。还有一个是希望数据参与运算时,减法能转变为加法,因为计算机只想实现一个加法器就够了,不想减法还来单独设计一个减法器。

生活中的时钟的模是12,9-3和9+9得到的都是6点位置,换句话说,-3和+9在这个时钟里面达到的效果是一样的,所以依赖模运算,我们就能将减法转变为加法,并且计算机CPU寄存器位数为固定字长,天然地就做了模运算,不用我们做什么(高位溢出的直接就丢弃了,又从0000开始,不就是相当于模运算吗)。

真值1的4位二进制是0001,用模1,0000-0001=1111(取低四位) =》0001和1111互为补数(求补数其实也可以直接:全部位按位取反,末位加1),在做运算时X-0001和X+1111是等效的,因此可以将减法转换为加法,CPU就只用实现加法器。所以用1111来表示-1,作为它在计算机里面的存储码,

以此类推,0010和1110互为补数,用1110来表示-2,作为-2在计算机里面的存储码

0011和1101互为补数,用1101来表示-3,作为-3在计算机中的存储码

.....

1000和它本身互为补数,用1000表示+8和-8均可,由于负数的存储码的首位都为1,所以这里就把1000作为-8在计算机中的存储码,这样的话就方便归类:正数最高位都是0,负数最高位都是1,就可以把最高位当成符号位来区分正负数。

这样一来,正数就用真值的二进制码在计算机里面存储,负数就用正数二进制的补数在计算机里面存储,这样来表示正数和负数,能将减法转变为加法的同时保证结果的正确性。因为负数的存储码是对应正数存储码的补数,就把这种存储码取名叫做补码。

这样看来,正数补码对应的十进制真值显而易见,而负数补码对应的十进制似乎不容易看出来,计算机当然用补码存储就好了,那我们日常怎么书写表示负数呢?那就发明一个原码吧,真值直接转成二进制,以符号位来区分正负。所以原码只是为了方便我们的书写,它不被计算机接受。

按照原码和补码的对应关系,原码怎么推出补码?正数的原码和补码一致;负数的原码的符号位为1,数字位是真值的二进制码,要变成补码,需要符号位不变,数字位按位取反,末位加1。这样一来,原码转成补码的规律就有了。

至于反码(符号位不变,数字位按位取反),它完全就是原码转成补码的中间产物,没有实际用处。

相关推荐

五缕头发解开贝多芬死亡之谜,意外发现身世秘密
世界杯多少个替补
bat365验证

世界杯多少个替补

07-29 👁️ 7071
酷派Cool1 dual参数
365官网多少

酷派Cool1 dual参数

08-22 👁️ 335
娱乐圈里的明星夫妻,中国明星夫妻名单大全
365平台怎么样

娱乐圈里的明星夫妻,中国明星夫妻名单大全

06-29 👁️ 2924
淘宝怎么看行业平均转化率?如何计算?
365平台怎么样

淘宝怎么看行业平均转化率?如何计算?

08-08 👁️ 3085
插卡式燃气表怎么使用(正确使用IC卡燃气表方法)