数学学习中的思考(二)计算机算数运算的数学原理

考研失利,但是还是在考研时学到了不少,也是因为对有的知识过于在意和深究,但是水平又有限。考研失利几乎成了必然。所以在研后我也终于鼓起勇气来记录我在学习时的思考和总结。

注意本人所写都是个人见解。

话休烦絮,这篇博客想写一下我在考408计算机综合时,看到的计算机组成原理。里面算数运算如何与数论结合起来思考。数论确实给了我理解其中思想的工具。不知道当年设计计算机的人是不是这么想的。

本篇的重头戏是减法运算

 

1、前置知识

1.1取余

取余是就是除法取余数,数学用mod 表示 。例如7~mod~3=1

计算机对取余的性质应用颇广。下面就来一一介绍

1.1.1寄存器不够大,会取余

寄存器就是计算机中算数运算时,存储两个变量的地方(暂时这么理解),同样也是存储计算结果的地方。例如:

unsigned int a=5;
unsigned int b=4;
unsigned int c=a+b;

变量  a b 都是存在寄存器中。同样变量 c 也要寄存器接收。

假设寄存器只有4 bit   那么 a 的编码就是  0101  。那么无符号 int 型的最大值就是 编码为 1111  也就是 2^4-1

如果是C++ 变量 c = 1而不是9   因为寄存器存不下 9  ,9的2进制是   1 0001    已经是5位数了。寄存器只会保留后4位数,因为寄存器太小了。所以得到的 c 变量不是 9 而是  9~mod~2^4=1

这就相当于取余操作。假设寄存器有  n 位,那么计算结果就只会保留 n 位。无符号整形的最大值就是  2^n-1。那么两个无符号整形进行运算的时候,只保留后 n 位。也就是说无论什么运算,都要对 2^n 取余。加法为例,在 n 位寄存器的计算机中代码   c=a+b  应该相当于c=(a+b)~mod~2^n

1.1.2取余的一些性质

只介绍一个重要的性质,那就是 算数运算 加、减、乘都满足的一个性质

(a+b)~mod~c=(a~mod~c+b~mod~c)~mod~c

(a-b)~mod~c=(a~modc~-b~mod~c)~mod~c

(a-b)~mod~c=(a~mod~c-b~mod~c)~mod~c

但是除法不满足 

(a/b)~mod~c\neq (a~mod~c/b~mod~c)~mod~c

和的余数等于余数的和再取余,差和积性质也满足。但是除法不满足。

不过除法有个算法,性质类似,但是要用到逆元。参考费马小定理

1.1.3逆元

以前的博客中我也介绍过逆元,这里再写一次。

这里只介绍加法逆元。因为后面会要用到。

在平常的运算中,我们常常可以得到这样的结论   a+b=0  那么  b=-a。那么 c-a=c+b

在取余运算中,假设是在对 n 取余的运算中 (a+b)~mod~n=0   那么我们称 b 是 a 在对n取余时的加法逆元

那么在取余运算时,就有类似于普通运算的性质(c-a)~mod~n=(c+b)~mod~n。证明并不难。这里不多介绍。

2、计算机中的编码与算数运算

计算机中编码的方式决定了计算的方式。虽然原码和补码的概念可能很常见,但是我用了别的方式去理解。

2.1编码

2.1.1原码

原码非常符合人类的思考方式,首位一个符号位,后面全是数值位。例如假设8位的寄存器用原码,第一位是符号位 0 代表正数 1 代表负数。   

0000 0111  表示    7

1000 0111  表示   -7

虽然这种编码方式符合人类的思维习惯,但是计算机不好处理。因为做减法很不方便。但是补码没有这个问题

PS:注意 int 型用原码表示,符号位占一位,8 位正数的范围就是 0 ~ 2^7-1   负数的数值为也一样 -(2^7-1) ~ 0。注意这里面有两个 0 负数里面一个 0 表示为 1000 0000 ,正数一个 0 表示为 0000 0000。

2.1.2补码

使用补码会使得计算机的算数运算的设计变得方便很多,因为使用补码可以让计算机用加法来表示所有运算。这是为什么呢?后面会介绍到。这里先介绍补码是什么。

补码对正数的表示方法和原码一样,例如也是 8 位的寄存器,表达 7 也是 0000 0111

但是 -7 却是 1111 1001 。

也许你会发现,补码的正数首位也为 0 负数首位也为 1 。和原码有同样的性质,但是性质相同可以说不是人为的设定,而是一种“巧合”。补码的设计就是为了方便计算机计算,所以更加详细的性质,我将在下面结合运算讲。

2.2算数运算

因为原码在计算机中少用了,所以后面的运算我全部介绍补码的运算。

2.2.1加法

计算机中的加法和我们平时“列竖式”做法差不多,例如 4 位的寄存器

0010+0011 = 0101      就是 2+3=5     对应位相加,满 2 就进位。4 位寄存器正数最大是 7 所以计算结果超过 7 就会溢出一位到符号位(最多溢出一位),变成负数。

至于正数加负数相当于减法,请看下面。

2.2.2减法

减法是本篇的重头戏,因为补码运算让计算机中的减法变成了加法,这其中到底是什么样的原理。

拿 6 位的寄存器举例(假设存在的话):00 0111 表示 7        11 1001 表示 -7。

将两个数相加    00 0111 + 11 1001 = 100 0000 

结果虽然是 100 0000 但是寄存器只有 6 位 所以最高为丢弃,就变成了 00 0000。这就实现了  7-7=0。

这是补码做减法的过程,如果计算某个数 a - 00 0111    那就相当于   a + 11 1001 。

7 的 补码是 00 0111 ,计算 -7 的补码方法就是  对 7 各位取反再 +1  。即 00 0111\rightarrow 111000\rightarrow 111001

接下来就是我关于如何理解补码的个人见解,也是本篇博客的核心

很神奇的事情是,在 6 位寄存器中计算,对于正数 a 把  a 各位取反再 +1 就能把这个数当做 -a 来用,这是为何?

这就是前面提到的逆元的用途以及寄存器中的算数运算都要取余

现在先抛弃掉对于补码的认知,假设我们对补码一无所知,6 位的寄存器我也不要什么符号位,全部算作数值位,即寄存器里面的数值全部当做无符号的正整数,最大的正整数就是 11 1111 = 2^6-1 ,那么正如1.1.1中提到的,在这样的寄存器中的运算都要对 2^6 取余。

如果你理解了上面一段话,你再看一个方程 (x+7)~mod~2^6=0。如1.1.3提到的,x 就是 7 在对 2^6 取余时的加法逆元。也就是说 某个数 (a-7)~mod~2^6=(a+x)~mod~2^6

我想说的就是一句话,在 6 位的寄存器中整数 -a 的补码就是整数 a 补码在对2^6取余时的加法逆元当然在 n 位寄存器中,-a 的补码就是 a 的补码在对2^n取余时的加法逆元

下面简单推理一下,为什么对 a 取反再 +1 就变成了加法逆元

还是以 6 位寄存器为例,令整数 a=7  补码为 00 0111    a 的反码为 a_{f} = 11 1000。

你会发现一个规律,无论 a 为多少  a+a_{f}\equiv 11~1111= 2^6-1  ,因为对 a 取反 再相加就是0 1互补,最后变成全1,这里的 a=7 自然也是。

那么 a+a_{f}+1= 11~1111+1= 2^6-1+1=100~0000=2^6 ,但是呢,这个值超过了 6 位,寄存器不够长,截取后面的 6 位   即(a+a_{f}+1)~mod~2^6=(100~0000)~mod~2^6=2^6~mod~2^6=0

既然(a+a_{f}+1)~mod~2^6=0   那么 a_{f}+1 就是 整数 a 在对 2^6 取余时的加法逆元。那么在数论中,对 2^6 取余时,某个数 x 始终存在(x-a)~mod~2^6=(x+a_{f}+1)~mod~2^6 。

在这个取余中 a_{f}+1 就相当于 -a 。那么我们就证明了 a 取反再+1 的到的值就是 a 的加法逆元。当然这也是  -a 的补码

不难推出的是,对于 n 位的寄存器同理 a+a_{f}=2^n-1

  (a+a_{f}+1)~mod~2^n=(2^n-1+1)~mod~2^n=0

PS:这里关键利用了1.1 中的那三个性质,最好熟悉那三个性质。

2.2.3乘法与除法

可能有人觉得乘法和除法比加减法难理解,其实不然。所以我不过多介绍。

乘法关键在于加法移位,比如 a*7       a *0000 0111,直接写成这样

a*(2^2+2^1+2^0)=a*2^2+a*2^1+a*2^0

a*2^2 就是 a 左移两位,加法就是上面提到的加法。所以这个式子就变成了 a 的几种移位相加

除法也不过多赘述了,就是“列竖式”然后相减,相减自然是补码的相加。

3、结语

考研失利丝毫不影响我喜欢数学,我发现了自己的浮躁,我要通过每日的冥想来增强自己的自制力。

关于本文的很多细节,也许写的不到位,如果有人有幸看到了这篇文章,欢迎你指出错误。

再次感叹,数学太奇妙,所有的计算机问题,都是数学问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值