关于补码的个人理解

关于补码的个人理解


读书的时候一直被补码的概念困扰,不知道为什么会有这种奇葩的表示方法,只知道如何计算补码应付考试,后来在读很多其它书籍的时候,都谈到了补码的概念,我觉得是时候好好理清思路了。

我们都知道,用原码表示的数,是没办法直接运算的,因为符号位的影响,算出来总是错的,人们就在想,如何让符号位也能直接参与运算呢

既然正整数可以直接进行运算,那将负数转化成用正数表示,不就可以直接运算了吗,所以这个问题又转化为如何用加法器去实现减法操作

在计算机中,据说原先是有减法器的,后来因为实现起来太麻烦,于是舍弃了,进行加减运算只能用加法器

于是人们尝试将同余的概念用到计算机中来解决这个问题,首先什么是同余,举一个最经典的例子,现在实际时间是7点,但是钟表上显示5点,这里是指的老式简单的钟表,12小时走一圈,不算上午下午的那种,那么我该如何校准钟表呢,最快的两种办法,顺时针调2小时,5+2=7,或者逆时针调10个小时,5-10=-5,实际钟表也指向了7,于是可以说,-10和2是针对12同余的,12是它们的模

假设用四个bit表示一个数,那么用原码表示的情况下
1 = 0001, 2 = 0010, 3 = 0011
-1 = 1001, -2 = 1010, -3 = 1011

我们来计算一个算式:3-1=2
用原码当然是无法直接计算的,但是这个算式我们可以转化为用加法计算
根据同余的概念,3 - 1 = 3 - 1 + 16 = 3+15 = 18 = 2

为什么会有这样的结论呢,因为对于4个bit的数,模就是16,二进制表示为1 0000,4bit表示的任何一个数,加上16,还是不变的,因为高位溢出了
那么,计算机中,将-1,存储为15,然后进行计算,不就是进行加法计算吗,而且正数的计算是不会受符号位影响的

通过求负数的同余,解决了两个问题,一是减法变加法,二是符号位参与运算

现在来看当时书中写的求补码公式,一个负数的补码 = 原码符号位不变取反 + 1

我们刚才计算的-1,原码是1001,取反1110,再加1,得补码1111
那对-1求同余,得到的15,用二进制表示,刚好也是1111,这是巧合吗

所以我感觉书上这个公式真是害人不浅,弄得神神秘秘的,让人无法理解,我当时还以为补码是由反码推出来的,其实根本不是那么回事
补码说白了就是对负数求同余,现在终于明白了

猜你喜欢

转载自blog.csdn.net/whitefish520/article/details/103487190