现代计算机cpu只能进行逻辑运算,即 与,或,非,异或,左移 右移。关于这块的具体原因可以Google搜索逻辑门等相关电路学科知识。 那么我们所有的加减乘除都必须使用上述上个基本逻辑去完成。而补码的出现就是为了辅助计算。
补码其实跟c语言无关,但是是因为学c语言期间学的所以记录下。
假设我们存在两个数据:A = 1,B = 1。(注意这里的1是二进制,也就是A+B=10) 在计算机计算A+B:
进位部分 对A和B进行逻辑与操作,那么本案例中:A与B=1所以进位部分为1基数部分 对A和B进行逻辑异或操作,那么本案例中:A与B=1,所以基础部分为0所以结果为 进位部分+基数部分=10
对于 4个bit 数值我们假设数据为A = 0010 B = 0001, 在计算机做计算A-B
因为 B+~B=FF ( ~ B)表示对B求反 所以: B+~B + 1 = 100 ~B+1=100-B
所以最终:A+(~B+1)-100=A-B
但是上述等式中存在一个问题,-100不是还是减法吗? 虽然-100是减法但是我们可以把它当成4Bit字节做加法运算时视为抛弃最高位进位即可。所以我们计算机存储一个数据时,既然不考虑最高位拿就直接拿去作为判断数据正负的依据。
综上述: A-B= A +(~B+1)
(~B+1)我们称为B的补码.所以补码存在的作用之一就是可以用于负数直接相加。
回到我们A-B的案例: 我们先求出B的补码: B首先取反:得到1110 然后加1:得到1111
最后 A的二进制加1111 的结果:0010+1111 = 10001 最后最高位舍去进位:0001
另外补码可以这样计算. 求4比特的Z的补码,当前Z等于7 Z无符号数最大范围为15(`4比特) 那么: 补(Z)=15-7+1=9
上面的公式就是: 补(Z)= 最大无符号数值-Z+1
简单推导方式就是: 补(Z)= ~Z+1
Z+~Z=F
~Z=F-Z
等式带入即可
假设 A/C ,A=00101,B=010011.
首先我们需要知道一个知识点:一个数据除以 2^n 就是二进制位向左移动n位。
所以上述计算:
B = 10000 + 10+1 B = 2^4 + 2^1 +2^0 所以 A/C=A无符号右移5位即可,所以A/C=0
由于和除法法类似不作讲解
二进制的奥秘:用逻辑运算实现加减法
