说到补码,总会有人想到:机器数符号位原码反码取反加一真值模 ... 。
其实,这些故弄虚玄的词汇,都是毫无用处的。
你看吧,码长八位时,各码的范围如下。
原码:-127 ~ +127。
反码:-127 ~ +127。
补码:-128 ~ +127。
看到了吗? -128,只有补码,并没有原码和反码。
没有原码,拿什么取反?
没有反码,拿什么加一?
不知道计算机专家,对于这样的漏洞,作何解释。
------------------------
在计算机诞生的初期,计算机所需的指令和数据,是需要人工输入到存储器的。
正负数据、文字符号等等,都要由人,求出对应的编码,再用拨动开关输入。
补码,在此时,就是由人工算出来的。
怎么算的? 方法就很多了。
当时,也没有现代所用的显示器。
计算机运算的结果,是由一排指示灯发光不发光表示的。
指示灯显示的信息,也得由人解释,才能得到真实的数据。
在这个阶段,才需要人类掌握 “正负数据与补码” 的变换方法。
其实,这种变换,方法是很多的。
人乃万物之灵,解题思路、解决方法,当然多种多样了。
并非只有 “取反加一” 一种。
求补码的最简单方法,就是前文介绍过的:0-X。
但是,现在的计算机课程,还拿着 “取反加一” 这种有残缺的方法来教学,实乃坑人不浅。
原码反码,在计算机中,都是不使用的,当然也是不存在的。
根本就不存在的东西,还要学生背下来、考试。
有些学生为此挂科,你说冤不冤!
------------------------
现代的计算机,有了键盘和显示器,也有了操作系统。
已经不需要普通人深入到存储器去理解二进制数的特点和意义。
在各种高级软件中,只须直接输入正负阿拉伯数字即可,根本就不用关心补码。
在用高级语言编程时,也允许编程者直接使用阿拉伯数字。
------------------------
只有在用汇编语言编程时,要用到计算机底层的知识,编程者才会接触到存储器中的二进制数。
但是,汇编语言所用的计算机知识,远远不是 “取反加一” 所能描述的。
比如,需要输入数值 “-125”,就必须输入:-、1、2、5、<回车>。
在汇编语言中,收到的,是 ”五个字符的 ASCII 码“。
先要把 1、2、5,这三个 ASCII 码,组成一个数字:1 * 100 + 2 * 10 + 5。
运算之后,将得到 125 的二进制数:0111 1101。
再根据前面输入过负号(-),进行一次:0-X。
这就需要执行指令:NEG AL,实现正数到负数补码的转换。
这就可以得到 “-125 的二进制数:1000 0011”。
NEG 指令的功能就是 0-X,有兴趣的朋友可去查一查 80x86 指令系统的介绍。
在整个过程中,用到 “符号位原码反码取反加一” 了吗?
没有!
------------------------
综上所述,“原码反码取反加一” 可说是一无是处。
如果把它们从计算机教材中删除掉,也不会影响到对计算机的理解。
用汇编语言编写的 “输入正负数据、排序、显示的程序”,可以在本博客中找到,此处不做赘述。
本文完