补码是为了解决计算机中负数加法问题而引入的一个概念.我学习补码的时候,只记住了负数补码的求法符号位不变,按位取反,再加一,至于为什么一直都不明白.所以这篇文章将尝试深入剖析这个问题

补码是一个相对的概念

设想有一个时钟,正好是3点,那么既可以是顺时针走了3格,也可以是逆时针走了9格,规定顺时针为正,那么3和-9其实在同一个地方,也就是说-9相对12的数是3.但是不一定非要相对12,相对15也可以的,-9相对15的数是6

补码的符号位变成值位

回到二进制中,在原码中,符号位表示这个数是正是负,但是一经转换成补码,符号位就变成了值位.
用5位二进制数做例子,最高位是符号位,其余四位是值位
\[-10_{d}=11010_{b原码}=10110_{b补码}\]
将最高位看成是值位
\[value=1\cdot 2^4+0 \cdot 2^3 +1 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0=22\]
所以22是-10相对哪个数字的补码呢?
一眼看出是32,但是为什么是这个是数呢?
考虑求补码的过程
符号位不变,按位取反,再加一.因为是负数,符号位为1,加上了\(2^4\);按位取反,本质是和1进行异或操作.到此为止求的是相对\(11111_{b}\)的补码,也就是相对于31的补码,最后再加上1,才是相对32的补码

补码的优势

补码的改进之处在于消除了符号位影响,所有的计算都是无符号的加法,计算完成之后,结果也以补码的形式保存.
另外说一句,我想了一下,好像只有二进制才能实现补码,因为只有二进制才能方便的进行取反操作,其他的数制都不能取反,只能直接和目标进行相减.

01-01 18:19