搞懂补码:CPU为啥非要用补码?不是位数不够补0!
一句口诀:负数的补码等于原码取反加一 。
只背这个公式,很多人心里一直有个疑惑:补码 ,难道就是位数不够,往后面补几个0吗?其实完全不是!
补码诞生的根源,是硬件的一个现实难题:CPU里面只有加法器 ,天生没有减法器。
如果专门去做一套减法电路,芯片设计会变复杂,成本也会增加。工程师想出一个绝妙办法:把减法运算,直接转换成加法来算 。
公式: A − B = A + (−B的补码)
CPU不去直接做减法 ,把负数用补码编码,直接相加,就能得到减法的结果。
拿最简单的4位二进制举例 ,4bit一共可以表示16种状态。
我们把16个状态一分为二:
0‑7 用来存正数;8‑15用来代表负数(‑8 ~ ‑1)。
规则
✅正数:补码 = 它本身,不需要做任何变换
✅负数:把对应正数的二进制全部按位取反,再加1 ,得到负数的补码
举个实例:计算 5‑3 ,等价于 5 + (-3)
1. +3的二进制: 0011
2. 求‑3的补码:全部位取反得到 1100 ,再加1 → 1101 , 1101 就代表‑3
3. 二进制加法运算:
0101 (5)
+ 1101 (‑3 的补码)
——————————
10010
4位寄存器只能保存4位,最高位多出来的1直接丢弃(溢出丢弃),剩下 0010 ,对应十进制就是2 。
5‑3=2,结果直接算对!全程只用了加法电路。
原码、反码 、补码三者区分
1. 原码:人的直觉写法。最高位当做符号位,0代表正数,1代表负数 。
缺点:会出现+0、‑0两个0 ,编码浪费,硬件加减处理麻烦。
2. 反码:只是一个中间过渡产物,计算机内存不会拿它存真实数字。
3. 补码:计算机内存真正存储整数的格式 。解决双零问题 ,用加法实现减法,汇编调试看到内存里的数字,都是补码。
划重点:不要把补码和8421‑BCD码搞混
- 补码:CPU内部整数运算用 ,专门处理正数、负数加减。
- 8421 BCD码:多用于数码管显示,4位二进制存1位十进制数字,偏向给人看 ,不做负数运算 。
本文来自作者[听风念海]投稿,不代表点新号立场,如若转载,请注明出处:https://sc-hx.cn/zlan/202609-15037.html
评论列表(3条)
我是点新号的签约作者“听风念海”
本文概览:补码计算|(补码计算方法)搞懂补码:CPU为啥非要用补码?不是位数不够补0! 一句口诀:负数的补码等于原码取反加一。 只背这个公式,很多人心里一直有个疑惑:补码,难道就是位数不...
文章不错《补码计算|(补码计算方法)》内容很有帮助