计算机中,为什么负整数用补码表示而不直接用原码,例
补码,是计算机进行正负数计算时,唯一使用的“代码”。
那么,什么是“补码”呢? 用“补码”表示正负数,目的何在呢?
还是先看看十进制数吧,看两位数就行:0 ~ 99。
它们都是自然数,计算机专业则称为“无符号数”。
随便算一个:27 + 99 = (一百) 26,
你也可以这么算:27 - 1 = 26。
如果你忽略了进位,这两种算法的功能,就是完全相同的。
99,本来并没有符号,却成了负数“-1”!
而且,加法,也竟然完成了减法运算!
原因:舍弃进位,就是减去了 100。再加 99,自然就是-1。 舍弃进位后,就把并没有符号的数,变成了负数!
同理,在计算机中舍弃进位:
● 正数(即所谓的“补码”)就能当成负数使用;
● 加法,也就代替了减法运算!
因此,只需给计算机配置一个加法器,便可横行天下!
重要问题说三遍:
* 补码的来历,是【舍弃进位】!!! *
* 补码的来历,是【舍弃进位】!!! *
* 补码的来历,是【舍弃进位】!!! *
---------------------
计算机,使用的是二进制数。
八位机使用八位数:0000 0000 ~ 1111 1111。
就相当于十进制数:0 ~ 255。
如果出现进位就是:2^8 = 256。
在这种环境中,就要用 255 (1111 1111) 当-1 了。
254 (1111 1110),就是-2 了。
。。。 。。。
128 (1000 0000),就是-128 !
以上这 128 个无符号数(128 ~ 255)就能代表负数(-128 ~ -1)进行计算。
以上这些正数,就是计算机专家所发明的“负数的补码”。
计算机专业教材上有这个补码定义式:[ X ]补 = 2^n + X。
(补码,和符号位原码反码取反加一,神马关系都没有!)
.
那么,127 (0111 1111),能不能当负数?
不能!
它的最高位是 0,相加后,产生不了进位 1 !
即使舍弃进位 0,它也不能呈现出负数的特点!
所以,0 ~ 127,都不能代表负数,只能代表它们自己。
因此,计算机专家就总结出来了:零和正数的补码,就是它们自己!
这句话,怎么有点别扭。。。
---------------------
那么,“补码的最高位 1,就是一个负数”的原因在于:
* 能产生进位的补码,才是负数 !!! *
看懂了吗? 最高位,并非是人为定义的符号位!
如果它真的是正负号(+、-),又怎么能参加计算呢?
而且,99,也没有符号啊,它怎么能当负数使用呢?
由此可知,符号位的说法,站不住脚。
由此可知,原码和反码,也都是胡乱的定义。
---------------------
其实,所谓的“补码”,它也是正常的二进制数,它本来就是没有符号的数字。
虽然,它们是一组数据中较大的一半,但是,它们仍然是“数”,并非是“神马码”。
因此,利用“补码”当做正负数做加减计算,与“无符号数”的加法,算法是完全相同的!
那么,“有符号数(补码)”、“无符号数”,就可以【共用同一个加法器】!
这就实现了“两种类型数据”的统一、“两种算法(加减)”的统一。
原码和反码,都没有这些功能。
所以,计算机中,不能使用原码和反码,甚至,都不保存它们。
“机器数原码反码补码正数三码相同负数取反加一符号位不变模符号位也参加运算时针倒拨正拨...”
这些都是垃圾!
你就是把它们都背熟了,也是啥用都没有的。
当然,你将来如果当上了计算机老师,你还可以拿这些去忽悠下一代学生。
所谓的补码,其实,就是一个“代替负数运算”的正数。
你可从十进制的计算来理解。
比如,限定使用两位十进制数(0~99)。
计数周期就是: 10^2 = 100。
那么有:
25 - 1 = 24
25 + 99 = (一百) 24
舍弃进位,只取两位的结果,+99 就和-1 是等效的。
那么,99,就称为-1 的补数。
同理,98,就是-2 的补数。
。。。
计算公式:负数 X 的补数 = 周期 100 + 负数 X。
如果是 n 位数,补数就是: 10^n + 负数 X。
-----------------------
计算机用二进制,补数,就称为“补码”了。
利用补码,就可以把加、减法,统一用加法来实现。
这样做,就能够简化硬件。
原码和反码,都不具备这样的功能。
所以,计算机中并不用原码和反码。
如果限定,使用 8 位 2 进制数,就是:
0000 0000 ~ 1111 1111。
对应十进制,就是: 0 ~ 255。
共有 2^8 = 256 种组合。计数周期也就是 2^8。
此时,-1 的补码,就是 255 (1111 1111)。
同理,-2 的补码,就是 254 (1111 1110)。
。。。
计算公式:
当 X < 0,则 [ X ]补 = 周期 2^8 + X。
一般化的形式是:
[ X ]补 = 2^n + X, n 是位数。
-----------------------
求补码,并不需要“原码反码符号位取反加一”。
扯上那些乱七八糟的,你就不会理解“为什么用补码”。