阅读:1931回复:7
科普第29篇——计算机是怎样做乘除法
前面几篇详细的讲了计算机做加减法的方法,那计算机是怎样做乘除法的呢?
其实一点都不复杂,我们其实都知道方法。 来看一下吧: 十进制:3 × 4 = 3 + 3 + 3 + 3 = 6 + 3 + 3 = 9 + 3 = 12 就这样? 没错,就这样!把乘法转换为连续加法来算! 但是计算机并不认识4到底要重复几次(计算机只能进行逻辑运算,是不“识数”的),所以,这时候就需要另外一个部件——计数器了。 计数器的原理就不细说了,反正大家只要知道,每做一次运算,计数器就会增加1(除非被清零或超过计数器计数上限才会回到0)。 于是,每做一次加法,计数器就增加1,直到计数器的数值和乘数相同。 在处理负数的乘数时,因为计数器并不能计负数,所以我们首先要取它的相反数,然后再做乘法,最后再根据乘数和被乘数的符号来决定积的符号:符号相同,积为正;符号不同,积为负。 而被乘数是负数并不影响加法计算,所以就不用单独处理了。 除法呢,估计大家都想到了,就是利用连续的减法来实现的。我们现在只讨论整数的计算,因此得到的是商和余数,不再计算小数部分。 比如: 十进制:15 ÷ 4 = 3 ...... 3 1、15 - 4 = 11 2、11 - 4 = 7 3、7 - 4 = 3 经过了3步减法,因此商是3,第3步的结果已经小于除数,因此是余数3。 还有涉及负数的除法,如果除数是负数,那么我们减法的结果实际是增大的,“结果小于除数”这一规定就没有什么意义了。而如果被除数是负数,那么也会出现一开始结果就小于除数的情况。所以在计算除法时,我们要把负数取相反数再来做减法计算。最后再根据除数与被除数的符号决定结果符号:符号相同,商为正;符号不同,商为负;而余数的符号总与被除数相同。 做除法还是要利用到计数器,计算一共做了多少步,直到减法计算的结果小于除数。最终计算次数就是商,最后一步减法的结果就是余数。如果是负数,先取相反数再计算。 在乘除法中,其实有一种更加简单的计算方法——移位。 怎么回事呢?其实我们可以发现,2的二进制表示是10。所以,一个数乘以2,就相当于把各位左移一位;除以2,就相当于把各位右移一位。 比如: 十进制:3 × 2 = 6 二进制:0011 × 0010 = 0110 十进制:12 ÷ 2 = 6 二进制:1100 ÷ 0010 = 0110 这个规律还可以扩展,一个数乘以2n,相当于把二进制各位左移n位;除以2n,相当于把二进制各位右移n位。 在处理乘除法时,我们会发现一些问题——计算乘法时,很容易溢出;计算除法时,又会出现除不尽的情况。 解决方法其实也没有捷径,为防止溢出,我们只有扩大表示数的表示位数,比如用16位数计算比8位数更不容易溢出。而现代编程与语言中,整数一般是32位的。 而除不尽的问题,有时我们就是需要整数的商和余数(比如计算最大公约数时),有时我们又需要小数的结果,这就涉及小数怎么表示了,我们以后再讨论小数的问题。 虽然我们可以用加法器来处理乘除运算,但是特别大的数的计算时(比如一些在大型机中运行的分子模拟、地理信息处理等),加法器效率就显得不足了,此时会需要专门的乘法器了。乘法器的基本构成其实还是加法器,不过对乘法计算进行了优化。 加减乘除四则运算我们都讨论过了,而其他运算其实都可以转换为四则运算。下次,我们讨论一下小数的表示吧。 ==========之前的文章========== 科普第1篇——计算机色彩 科普第1篇补遗——CSS颜色 科普第2篇——光盘 科普第3篇——2、8、10、16 科普第4篇——电池 科普第5篇——浏览器 科普第6篇——字符编码 科普第7篇——加密解密 科普第8篇——移动通信技术 科普第9篇——为什么32位CPU不能支持大于4GB内存? 科普第10篇——智能手机简介 科普第11篇——14.52-14.49=0.0299999? 科普第12篇——为什么HTTPS会更安全? 科普第13篇——计算机语言 科普第14篇——字体(上) 科普第15篇——字体(中) 科普第16篇——字体(下) 科普第17篇——域名解析 科普第17篇补遗——域名 科普第18篇——虚拟内存 科普第19篇——时间 科普第20篇——日期 科普第21篇——日期时间补遗及计算机的时间 科普第22篇——网络(0):基本概念 科普第23篇——二进制的线性编码 科普第24篇——网络(1):OSI模型 科普第25篇——外部接口(第一次修订) 科普第26篇——计算机是怎样做加法的 科普第27篇——计算机是怎样做加减法的 科普第28篇——计算机是怎样处理负数的 科普番外篇1——虽然没用但了解一下也很有趣的知识 科普番外篇2——月食 |
|
沙发#
发布于:2012-08-09 18:24
看到这就想到C语言 想到C语言就头痛.....
|
|
2楼#
发布于:2012-08-09 18:36
= = 最近一直在纠集运算呢……头疼……
|
|
|
3楼#
发布于:2012-08-09 18:46
为下学期的c语言打打基础
|
|
|
4楼#
发布于:2012-08-09 20:59
过来学习一下,谢谢分享!
|
|
|
5楼#
发布于:2012-08-09 22:26
。。。今天又長知識了,知道了原理後就可以用單片機和矩陣鍵盤做一個簡易計算器了嗯。。。
|
|
|
6楼#
发布于:2012-08-10 05:29
回 3楼(银黑劫火) 的帖子
这个算是数字电路的范畴吧 |
|
7楼#
发布于:2012-08-11 13:52
对这类没啥兴趣啊。看着就头晕
|
|
|