现在,大家都知道,计算机使用的是:二进制。
我们平时用的十进制、计算机用的二进制,这两者,并没有本质的区别。
一个数值 N,可以用不同的进制(十进制、二进制、十六进制...)来表示。
不论使用什么进制,N,都是同样的数值。
二进制的特点,也不过就是【逢二进一】,仅此而已,不必大惊小怪。
计算机中的数值 N,其实,也就是一个数值而已。
千万不要以为,是个二进制数,就会有一个 “符号位”。
哪有什么 “原码反码补码、取反加一、模、浮点数 ...” 啊!
这些,和计算机原理,并无半点关系!
------------------------------
在计算机中,字长,是固定的。
八位机,每次运算,就是八位二进制数。
如果在计算时,向第九位出现了 “进位”,计算机就会另外存放。
这个进位,编程人可以保留,也可以放弃。
下图,是两个八位二进制数相加的竖式:
图中,也列出了同一个数值的十进制算法。
这两个二进制数,分别是:0111 0101 = 117 (十进制)、1101 0111 = 215 (十进制)。
它们的和,用十进制来表示,很显然,就是:332。
相加过程中,出现的进位,用 “棕色” 做了标记。
二进制的第九位的 1,用十进制数表示,就是:256。
如果,你在编程的时候,抛弃了进位,这次计算,就是 117-41 = 76。
此时的 215,就不是 215 了! 它就代表-41 了!
它就是计算机专家所说的:【-41 的补码】!
实际上,计算机仅做了一次加法运算。
用的数值,也是同一个值,即:1101 0111 = 215 (十进制)。
但是,怎么会有两者解释呢?
这个值,它到底是 215,还是-41 呢?
这就要看,你编程时,是怎么处理 “进位” 的。
呵呵,这说法,学软件的同学,就很可能觉得难以理解了。
进位是什么? 小学的算术课,大家都学过的。
但是,用高级语言编程时,就看不见 “进位” 了。
所谓的高级语言,既不是计算机语言,也不是人类的语言。
只是由一些小学没有毕业的人,胡乱编造的语言。
就比如说吧:“回车、换行”,本来是 ASCII 码中的 “0D、0A”,
但是,在 C 语言中,偏偏要用 “\n” 来表示。
此类写法,还有许多。
本来很简单的事,用高级语言来解释,就麻烦透了。
一般来说,好好一个孩子,学完了高级语言,就迷迷噔噔了。
------------------------------
实际上,在计算机中,只有【二进制数】而已。
计算机,也只会对这些二进制数,进行加法运算。
所谓的 “无符号数、有符号数、符号位、原码反码补码”,都是不存在的。
所谓的 “浮点数”,也是一组二进制数,需要由软件进行深度处理,才能知道它代表的是什么。
------------------------------
计算机中的二进制数,可能是:
正数、负数、整数、小数、浮点数、补码、ASCII 码、BCD 码、格雷码 ...,
也可能是:七段码、字形点阵码、颜色、声音、动画、命令、状态 ... ,
甚至是:各种密码,代表各种不可言传的信息 ... 。
它到底是什么东西?
这就与计算机无关了!
完全取决于 “编程人的思路”。
但是,编程思路,并不属于《计算机组成原理》。
学习《计算机原理》,只要学会了二进制数的运算方法,即可。
不必乱七八糟的瞎联系。
就比如,一台汽车,有不同的行驶状态:
快、慢、漂移、单侧轮、爬台阶、翻滚、掉入陷坑 ... 、
这些,只与驾驶员的操作方法有关,和《汽车原理》并没有确定的关系。
------------------------------
计算机基本的算术运算是:加法。
计算机在做运算时,只是按照【逢二进一】的规则来做。
此时,并没有什么 “无符号数、有符号数、原码、补码、小数” 的说法。
也可以说,计算机,只使用【无符号整数相加的方法】。
--------------------
比较复杂的运算,是:乘法和除法。
计算机在做这两种运算时,就要反复的运用【相加的方法】。
也就是说,乘除运算,仍然是用【无符号数相加的方法】。
所谓的:
原码的乘法、补码的乘法、
原码的除法、补码的除法,
纯属无稽之谈。
------------------------------
《计算机组成原理》是一门以硬件为主的课程。
在硬件基础上,开机首先运行的是《操作系统》。
在系统软件运行起来之后,计算机才能运行各种 “应用软件”。
绝大多数的编程人,只有在这时候,才会用到 “浮点数”。
在介绍硬件的时候,为何要掺杂进去与硬件无关的 “浮点数” 呢?
不可理解。
本文完