模运算系统与补码

1. 什么是模运算系统?

我在网上查的资料,说模运算系统属于代数中环的概念,但是我只学过微积分、线性代数这些基本的数学而且掌握的一般,对于代数中的群域环也只是听过但不曾了解。

因为关于代数学的那些资料我实在是看不懂,下面,我就按照我的理解来给他下一个定义,很有可能不严谨甚至是不对,但是对于帮助我在学习计算机系统中的补码概念时的理解理解能自圆其说。我说的不对的地方还请斧正!

钟表是我们最常见的模运算系统之一,他有 12 个小时,满 12 小时就会回到最小值 0。

因此,我们不妨将其抽象成,一个代数系统中只有 0、1、2、3、…、11 这 12 个数,对于所有不在这 12 个数中的数都要用这 12 个数表示,那怎么表示呢?就用到“环”了(这里的环只是我个人的理解不是代数概念中的环!),我们先来看看 0-11 这 11 个数意味着什么?对于 0,相当于我们划了一个圆站在其中的一个点(记为原点),那么对于 1 呢?就相当于从原点出发沿着顺时针方向走了圆环周长的 1/12,对于 2 便是从原点出发沿着顺时针方向走了圆环周长的 2/12,因此,13 这种不在 0-11 中的数字我们可以理解成从原点出发沿着顺时针方向走了圆环周长的 13/12,便是数字 1 所在的位置,于是就有在模 12(总共有 12 个数)的模运算系统中 1 和 13 是等价的。

再抽象一些,上面的一大段话我们可以用一个式子来表达

1
A=B+K×M K∈Z

对于任意一个不在模运算系统中可以直接表达的数字 A(如上文的 13 这种),若能找到一个在模运算中可以直接表达数字 B,有上式成立,则 A 与 B 在模为 M 的模运算系统中等价。而 K 的值我们可以理解成我们沿着圆环走了多少圈。模 M 为运算系统中数字的个数,上例中 M=12。

2. 将减法变成加法

这里我们只考虑两个在模运算系统中可以直接表达的数字之间的减法,我们接着上面的例子说比如8-2,我们都知道等于 6,那如何用加法来表示呢?那么问题就变成了8+?=6,我们知道在模 12 的模运算系统中 6 和 18(12+6)是等价的(就是多走一圈嘛),因此这里的就可以等于 10。

P.S. 如果要求也是模运算系统中可以直接表达的数字且做加法,那么他应该是唯一的,否则不唯一。

那么我们如何快速的知道就是加 10 呢?可以这么想,-2 就是逆时针走两个单位,那么总共是 12 单位,我顺时针走当然走 12-2=10 个单位。

3. 模运算系统在补码中的应用

我们常见的计算机都是 32 位或者 64 位的,这里的多少位就是 2 进制的位数,我们考虑简单些,如果是 4 位的,那么可以表示 24=16 个数,又因为如果做加法得到的结果需要 5 位来表示,但只有 4 位,会自动舍掉最高位(相当于计算结果除以 24后的余数),因此是模为 24的模运算系统。

在模运算系统中从 0000-1111 每个数都可以对应无数个数,为了唯一对应,我们规定 0000 为 0,其余 0 打头的为正数,1 打头的为负数,因此他能表示的数的范围为 [-23,23),类似的,n 位能表示的数的范围为 [-2n-1,2n-1)。