[计算机基础]补码、模与运算

来源:互联网 发布:淘宝 原单店 编辑:程序博客网 时间:2024/05/22 11:31

  补码这个概念从开始学的时候就一直记不住到底是怎么运算,看一次忘一次。备考时又拿出来看到了,这次就好好看看为什么会有补码、补码为什么叫补码、补码是干什么的。

补色

  在解决这些问题之前,我们先来谈谈补码的这个“补”字。说起“补”,会想起以前美术课上学过的补色。所谓补色,就是色相环上相距180°的色相。就像下图上“黄”和“青紫”互为补色。


色相环

  在观察颜色的时候,补色会随时随地的跟着主色的出现而产生。我们可以发现补色会让主色更加地明显。就像黑色和白色单独存在时,并不会显得白的很白、黑的很黑,但是如果将两者放在一起,就会有白的很白、黑的很黑的现象。而且补色还可以避免视觉对主色长期观看后产生疲劳,比如做手术的大夫穿绿色手术服,是因为手术中有大量红色的血,人看久了就会怠慢,从而延误手术。青绿色是红色的补色,大夫穿上了青绿色手术服,手术中看到红色,也看到青绿色,从而避免怠慢。
  说白了,“补”这个概念不是单独存在的。当提到两个相对应的事物时,若把一方称为“主”,那么对应的一方就称为“补”。我们找出这个称之为的“补”的事物来,是为了更好的认识称之为“主”的事物。

为什么需要补码

知道了“补”这个字的含义之后,我们就可以来看看计算机是如何利用“补”的含义来完成一些极其重要的任务的。
GOOGLE时,看到豆瓣的一篇文章。我们需要用计算机完成运算。但是计算机中只有加法器,当我们想做减法时没有减法器来让计算机直接知道减法的结果。为了解决这个问题,补码出现了。

模和补数

假如现在是6点,想知道3个小时前是几点,我们可以直接把时针逆时针旋转3个小时,也可以顺时针旋转9个小时,得到的时间是一样的。用数学语言我们可以这样表示:

6 - 3 = 6 +(12 - 3)

还有,我们可以发现把物体左转60度,和把物体右转300度的结果也是一样的。
数字 87,减去 25,和加上 75,在不考虑百位数的条件下,效果也是相同的。
上述几组数字,有这样的关系:
  3+9=12
  60 + 300 = 360
  25 + 75 = 100
式中的 12、360 和 100,就是“模”。
式中的 3 和 3、60 和 300,以及 25 和 75,就是一对对“互补”的数字。

知道了“模”,求某个数字的“补数”,就是轻而易举的了:
如果模为 365,数字 120 的补数为:365 - 120 = 245。

用补数代替原数,可把减法转变为加法。出现的进位就是模,此时的进位,就应该忽略不计。
对于6-3=6+(12-3)。在有模的前提下,我们去掉6,得到:

-3=12-3。

我们可以把减法理解成加一个负数。于是我们在计算减法时只要加上模减去这个负数的绝对值就可以得到正确的结果。
这样就给我们在计算机中做减法提供了一个良好的思路。

二进制的模

十进制下,两位数的模是100,三位数的模是1000,n位数的模式10^n。在二进制下,我们可以发现两位数的模是100(十进制的4)。模表示数字的容量和状态,两位二进制能表示4个数。所以可以推出,n位二进制的数的模式2^n,也就是1后面有n个0。

如果是 3 位二进制数参加运算,模就是 1000(2^3),即 1 的后面加上 3 个 0;
那么当 8 位二进制数参加运算,模就是 1 0000 0000(2^8),即 1 的后面加上 8 个 0。
16 位二进制数参加运算,模可就大了,是 1 的后面加上 16 个 0。

二进制的补码

在计算机里,数字、字符串等等会被称为“码”,还有机器码。那么补数也就变个称呼,显得专业一点,我们称之为补码。
前面我们说了补码的提出是为了解决减法计算的问题。所以在计算时,加法运算我们仍然按照原来的机器码(原码)进行计算。
我们一般是在8位二进制的情况下讨论补码。
例如-3的原码是10000011,其绝对值的原码是00000011。那么-3的补码就是100000000-00000011=11111101。

应用补码进行计算
用补码计算:83-25=58。

    83  ---都变成补码,再用加法运算-->  0101 0011
  - 25  -> 1 0000 0000 - 0001 1001-> + 1110 0111
 -----          --------
    58  <--忽略进位1,结果就是正确的--[1] 0011 1010

计算正确的前提是参与运算的数字不能大于模。若是大于模,模也需要变大。

总结

  1. 首先“补”和“模”的概念适用于像色相环、钟表这种有个环的事物,模就相当于那个环。十一点加一个小时就是零点,在8位二进制的数字中,11111111加1就是00000000。当你忘了补码的样子,就想一想钟表吧。正是有了模,才有所谓的补。
  2. 其次在二进制中,n位数的模就是2^n,也就是1后面有n个0。
  3. 负值在内存中以补码形式存贮
  4. 负数X的补码 = |X|按位求反+1
    = X按拉求反(除符号位外)+1
    = 模 - |X| (强调了补码运算本质上是一种模运算,这就是称其为“补码”的缘由)
  5. -128的补码是10000000,等于128的原码。

问题

1.负数的补码是什么时候算出来保存到内存里的?

0 0
原创粉丝点击