关于二进制负数的补码
2022-12-14 · 百度认证:北京惠企网络技术有限公司官方账号
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
例子:求-5的补码,过程如下:-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011),所以-5的补码是11111011。数0的补码表示是唯一的。
[+0]补=[+0]反=[+0]原=00000000;[-0]补=11111111+1=00000000。
扩展资料:
补码系统的最大优点可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便。
另外,补码系统的0就只有一个表示方式,这和反码系统不同(在反码系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。在n比特的补码加减法中,忽略第n+1个比特的作法在各种有号数加法下都适用(不过在判断是否溢出(overflow)时,仍然会用到第n+1个比特)。
因此在补码的系统,加法电路就可以处理有负数的加法,不需另外处理减法的电路。而且,只要有电路负责数字的变号(例如将1变换为-1),也可以用加法电路来处理减法。而数字的变号就用计算数字的补码来完成。
参考资料来源:
补码,是计算机进行正负数计算时,唯一使用的“代码”。
那么,什么是“二进制的补码”呢?
你先看看十进制数吧,看两位数就行: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)进行计算。
以上这些正数,就是计算机专家所发明的“负数的补码”。
(补码,和符号位原码反码取反加一,神马关系都没有!)
.
那么,127 (0111 1111),能不能当负数?
不能!
它的最高位是 0,相加后,产生不了进位 1!
即使舍弃进位 0,它也不能呈现出负数的特点!
所以,0 ~ 127,都不能代表负数,只能代表它们自己。
因此,计算机专家就总结出来了:零和正数的补码,就是它们自己!
这句话,怎么有点别扭。。。
---------------------
那么,“补码的最高位 1,就是一个负数”的原因,如下。
* 能产生进位的补码,才是负数 !!! *
* 能产生进位的补码,就是负数 !!! *
* 能产生进位的补码,必定是负数 !! *
---------------------
看懂了吗? 最高位,并非是人为定义的符号位!
如果它真是正负号(+、-),又怎么能参加计算呢?
而且,+99,也没有符号位啊,它怎么能当负数使用呢?
由此可知,符号位的说法,站不住脚。
由此可知,原码和反码,都是胡扯!
---------------------
其实,所谓的补码,根本就不是神马码,它也是正常的二进制数。
虽然,它们是一组数据中,较大的一半,但是,它们仍然还是“数”,不是码。
利用“补码”代替正负数,进行加减计算,与“无符号数”的加法算法,是完全相同的!
那么,“有符号数”、“无符号数”,就可以【共用同一个加法器】!
这就实现了“两种类型数据”的统一、“两种算法(加减)”的统一。
原码和反码,都没有这些功能。
所以,计算机专家费尽心思创造的原码和反码,诞生后,随即就被抛弃了。
虽然,还有许多人,苦心孤诣的琢磨原码和反码的算法,但是,都没有任何成果。
补码,是一个“与负数等效”的正数。
---------------------
你如果学过三角函数,就知道,三角函数的周期(T)是 2π。
任何负的角度,加上 2nπ,都能得到:等效的正角度。
比如,-π/2,与其等效的,就是:+3π/2。
---------------------
2 位 10 进制数,是:0 ~ 99。
其计数周期就是:T = 10^2 = 100。
此时,可以有:
25 - 1 = 24
25 + 99 = (一百) 24
你只要舍弃进位,留下 2 位数,+99 就和-1 等效。
---------------------
8 位 2 进制数,是:0000 0000~1111 1111。
(对应的十进制是:0 ~ 255。)
其计数周期就是:T = 2^8 = 256。
任何负数,加上 nT,都能换算成与其等效的正数。
-1 的等效值,就是:-1 + 256 = 255 = 1111 1111。
---------------------
正常计算,可以这样做: 1 - 1 = 0。
用等效的正数计算,即: 1 + 1111 1111 = (1) 0000 0000。
你舍弃进位,只保留 8 位,这两种算法,效果就是相同的。
按这思路做,就消除了负数,并且,加法,也就代替了减法。
计算机的硬件,也就因此而得到了简化。
---------------------
这个“与负数等效”的正数,就是计算机专业所说的“补码”。
计算机专家的数学底子太洼,搞不懂什么是周期、什么是等效。
就自己胡编乱造:“符号位原码反码取反加一符号位不变”。
老外的算术能力差,由此可见一斑。