您的当前位置:首页正文

学习笔记-原码、反码和补码

2022-08-01 来源:客趣旅游网
学习笔记-原码、反码和补码

计算机中的数都是以⼆进制补码的形式存储的,因此理解原码反码和补码的转换尤为重要,此笔记为本⼈学习的⼀个记录,⼀是为了加深印象,⼆是为了与⼤家分享。若有不⾜之处,希望能在评论区帮忙指正,愿读者看完后能有所收获。⾸先要明确的是,讨论原码、反码、补码都是建⽴在有符号数的基础上的,⽆符号数讨论这些没有意义。注意要区分的是某码(某可以是:原、反、补)和真值。⽐如:

-10010010 | 10001101+10010010 | 10100010

左边都都是真值,右边的叫做某码(在这⾥先把真值与各种码区分开就⾏了)。正数的原码、反码、补码都是正数本⾝,⽐如 +6 ,在⼋位⼆进制数表⽰下:

原码 0000 0110反码 0000 0110补码 0000 0110

负数的原码、反码、补码就不⼀样了

1. 原码:最⾼位为符号位,剩余位表⽰负数的值

2. 反码:将原码的符号位不变,其余位取反,即可求得反码3. 补码:反码加 1 即是补码

对于⼤部分数字,按照此操作求其原码、反码、补码都可以很顺利,但是有些数字求补码的时候会很疑惑,⽐如在 8 位⼆进制表⽰下 -128的补码,在这⾥读者可以试着求⼀下,答案是 1000 0000.为了解决疑惑,在这⾥着重讲⼀下补码

⾸先要知道补码为什么诞⽣,因为计算机内部只有加法器(这句话我不太确定是否正确),但是计算过程中会涉及到减法,我们希望通过加法实现减法,即⼀个数 A,减去⼀个数 B 的结果,可以⽤⼀个数 C 与 A的和表⽰,即想达到 A - B = A + C,这⾥的 C 就是 B 的补码。

接下来讲为什么可以⽤ A + C 表⽰,这⾥就要了解另⼀个概念了——溢出。⽐如在⼋位⼆进制数的加法中 1111 1111 + 0000 0010,结果应该是 1 0000 0001,但是计算机只能存储 8 个⼆进制数,第⼀个 1 在计算机中就被简单的舍去了,即 1111 1111 + 0000 0010 = 00000001,⼀个⼤数加⼀个数,结果却⽐⼤数要⼩。看图⽚

现在计算 8 - 6,结果⼀眼就看出 8 - 6 = 2,如何⽤加法实现这个呢?如图

到了这⾥再讲⼀种求补码的⽅式,补码 = 模数 - 其正值的原码,就拿-6为例(8位⼆进制下),其正值对应的原码为 0000 0110, 8位⼆进制能表256个数,所以模数就是 256,即 1 0000 0000,可以拆分成1111 1111 + 0000 0001,计算过程可以先拿 1111 1111 - 0000 0110 再加0000 0001,这算下来不就是按位取反再末尾加 1 吗?不是跟公式⼀样吗?,确实是⼀样的,但是求解的步骤不⼀样,现在你再去求⼀下 8位⼆进制下的 -128 的补码,会发现很容易理解为什么是 1000 0000。tip: n 位⼆进制的模数为 2n

还有⼀种码叫做移码,⽐如 8 位⼆进制能表⽰的有符号数范围为 -128-127,按从⼩到⼤⼀次分配⼆进制数,产⽣的码叫移码

-128 | 0000 0000-127 | 0000 0001-126 | 0000 0010... ...

126 | 1111 1110127 | 1111 1111

移码具有能直观⽐较出⼤⼩的特点,它与其对应补码的不同是最⾼位刚好相反。

最后再说⼀下,若求补码,要先确定数字的位数,相同的数,在不同位数下表⽰出补码的结果不同,但有⼀定规律,请读者⾃⼰发现吧,在这⾥举⼀个例⼦:-128在8位⼆进制下的补码是 1000 0000,16位下是1111 1111 1000 0000.如有误,请帮忙指正,谢谢!

Processing math: 100%

因篇幅问题不能全部显示,请点此查看更多更全内容