关于源码补码

今天看原码反码补码,简单记一下。

计算机只有 0 和 1,那负数怎么表示?最直接的想法就是拿最前面一位当负号,0 是正、1 是负,剩下照抄绝对值,这就是原码。但马上就有毛病:这么一来零有两个,一个正的零一个负的零;而且算减法的时候还得先比大小、再决定结果是什么符号,电路特别别扭。

于是有人想,干脆让负数换个写法,让减法能直接当加法算。第一步是反码,负数就是把它每一位都反过来(0 变 1、1 变 0)。这样 7 加 -5 差不多能算出 2 了,但还差一点,进位得绕回来补一次,零也还是两个,没弄干净。

第二步就是补码:负数先按位取反,然后再加一。就加了这么个 1,事情全顺了——零变成只有一个,减法真的可以直接当加法算,多出来的进位扔掉就行,什么都不用管。所以现在的计算机存的都是补码,Java 里的 int、long 这些也都是补码。

至于为什么要加那个 1,我是用钟表想明白的。表盘一共 12 个小时,转一圈又回到原处,所以往回拨 3 小时和往前拨 9 小时是一样的。八位二进制也一样,一共 256 个数,装满了就归零,所以 -5 就等于往前走到 256-5,也就是 251。而拿 256 减一个数,正好等于"把它每一位反过来再加一"。所以加一不是硬规定,就是这么算出来的。

在 Java 里试一下也很直观:-5 用二进制打出来末尾那几位是 11111011,正好是 251;而 Integer.MAX_VALUE 加一,不会报错,会变成最小的那个负数,因为补码就是这么绕圈的。

记住结论就行:原码是人看着顺眼的写法,补码是机器真正在用的写法。

posted @ 2026-09-24 23:07  呱哒  阅读(5)  评论(0)    收藏  举报