软硬件融合技术内幕 终极篇 (4) —— 人类历史的丰碑
在上一期,我们一期探讨了计算机如何计算四则运算中最简单的加法。那么,我们如何来计算加法的逆运算——减法呢?
让我们先从小学生常见的问题来回溯到17世纪的欧洲。
几乎所有的小学生都会问老师一个问题:一个较小的自然数,减去一个较大的自然数的结果是什么呢?
在初中数学中,答案很简单:负数。
而两个自然数的加法,依然是自然数。减法的出现,就将自然数的领域扩大到了包含自然数、0和负数的领域,也就是整数域。类似地,除法、开方和对数运算会将数的领域扩大到有理数、代数数(不严谨的称呼为无理数)和超越数。
最有名的超越数是e(自然对数的底)和π (圆周率)。而这两个数和0,1,i(虚数单位)这三个最基本的数,又构成了一个优雅的等式……这个下期再告诉大家,看看大家会不会
让我们回到今天的主题——计算机如何计算减法。
实际上,在人类看来,减法可以转换为加法,只要把被减数换成对应的负数(术语曰:相反数)。
如:2022-1926=96,可以转换为2022+(-1926) = 96。
那么,我们只需要在计算机中,用合理的方式表示负数,就可以实现减法了!
话分两头。
我们知道,计算机使用二进制来表示数字。那么,由于受到二进制位数的限制,计算机可以表示的数字也是有上限的。如8051单片机是8bit的,其加法器单条指令能计算的上限就是8个二进制数,也就是从00000000b到11111111,相当于十进制的0到255。
那么,当255+1的时候会发生什么呢?
让我们从人类视角和从计算机视角分别看。
从人类视角看,这是很简单的一个问题:
255+1 = 256
而从计算机视角看,算式是这样的:
具体到加法器的输入和输出则是这样的:
我们发现,在上图呈现的计算机加法器中,由于只能计算8bit数,产生了255+1=0这样的结果!
我们知道,减法是加法的逆运算。也就是说,既然在8位计算机的视角看来,255+1=0,我们就可以把255视为-1。在8bit整数运算的场景下,在需要减去1的情况下,把255作为加法器的另一输入,就可以实现减法:
以此类推,我们可以认为,11111110代表-2,11111101代表-3……
这种方式叫做二进制补码表示法。其规律是,想得到一个整数的相反数,就将其按位取反再加1,并通过最高bit来作为标志位,判断是正数还是负数。以8bit整数为例:
00000000到01111111,也就是表示正数的0-127;
10000000到11111111,也就是表示负数的-128到-1;
以最高有效位(MSB,Most Significant Bit)为正负标志位,MSB为0的时候为正数,MSB为1的时候为负数。
可以类推之16位:
00000000 00000000到01111111 11111111,表示正数的0到32767;
10000000 00000000到1111111111111111,表示负数的-32768到-1;
32位、64位整数的范围也可以以此类推。
在计算机设计中,更困难的问题是如何解决乘法问题。
二年级以上的小朋友们都理解,乘法的计算显著比加法要复杂,其运算也更慢。对于计算机而言也是如此。特别地,对多位数的乘法需要列竖式进行:
类似地,在计算机中也需要通过类似“列竖式”的方法来解决乘法问题。
在下一期,我们会详解计算机乘法的实现。
本期的内容实际上涉及到一个名词:伽罗华域。伽罗华域是现代计算机技术的理论基础之一,以欧洲19世纪天才数学家伽罗华的名字命名。伽罗华在推翻波旁王朝的第二次法国大革命(又称七月革命)中支持三色共和党,反对帝制,被非法关押后,又被敌对势力诱导参加决斗,身受重伤而死,时年21岁。然而,只要人类文明还存在,伽罗华的名字和他开创的“群论”,就会永远流传下去。
可见,一个人无论是依靠自己的奋斗,还是同时考虑到历史的进程,只要为人类的进步做出过微小的贡献,无论人生的长度是21年还是96年,都将会永垂史册,铭刻在人类进步历史的丰碑。
相关文章
- 高可用架构和系统设计经验
- 我终于统一了团队的技术方案设计模板
- SVN提示locked解决办法
- Edittext In Listview,当listview的item中有edittext时,怎么保存edittext的值?
- setOnTouchListener使用记录
- 异常的出现情况及解决方式(持续更新中)
- xUtils 的 post和get 请求 使用记录
- 在代码修改textview的Drawable 和 使用webview 加载网页
- 修改魅族和小米状态栏的文字颜色
- 自定义View实战(一) 汽车速度仪表盘
- 自定义View实战(二)QQ健康水滴形加载
- java.lang.UnsatisfiedLinkError 解决方法
- Material Design之CollapsingToolbarLayout 相关属性和方法介绍
- MaterialDesign之Dialog
- 在友盟分享的基础上集成微信登录
- 关于魅族手机 安装APP提示安装失败 更新包不兼容的解决方法
- java.lang.ExceptionInInitializerError 错误 解决方案
- Error in swirlExpectation(condition(object))
- 集成微信登录和分享真的很简单
- 推送SD K信鸽推送 和 个推推送 调研对比