昨天下午,我在书桌右手边翻到一张 2003 年 9 月的《电子报》剪报,纸边发脆,手指一碰就掉下几粒细屑。剪报背后用蓝色圆珠笔写着“-3=1101”。笔迹是外公的,力道重得几乎划破纸背。我盯着那四个数字看了很久,茶杯里的滇红凉到第三泡,颜色从酒红退成琥珀。
那一刻我想起张定远。他是我大二计算机组成原理课的老师,六十七岁,习惯把粉笔掰成两截用。讲到补码那节,他转身在黑板上画了半面墙的位图,说:“8 位里,-3 的补码是 11111101。你先取 3 的反码 11111100,再加 1。”他停了两秒,用第二截粉笔敲了敲黑板边缘,“这个 1,是借来的,也是还掉的。”
我在笔记本上抄下 11111101 的时候,窗外正飘着一场没下透的雨。前排女生小声嘀咕:“为什么不是直接加符号位?”张定远头也没回:“因为减法电路太贵了。1945 年冯·诺依曼那帮人想用加法器解决一切。”这个数字回答,我记到今天。
后来我在旧货市场找到一块 1978 年的 Datapoint 磁盘控制器板,花了 140 块。板子角落有一颗 39 欧电阻,色环是橙白黑金。橙色代表 3,白色代表 9。我把万用表调到欧姆档,表笔搭上去,读数在 38.7 到 39.2 之间跳。我忽然想,-3 的补码大概也是这样——一个被约定好的负数,用最接近正数的方式活了下来。
很多人把补码讲成“取反加一”的口诀,我不太喜欢这种教法。说实话,补码真正迷人的地方不是规则,是它把减法变成了加法。所有负数都在同一个模里排队,-3 和 253 在 8 位世界里握手言和。这比“符号位”三个字温柔得多。
再讲一个具体的。今年 3 月 14 日下午 4 点 27 分,我在调试一个 8 位计数器,输入 -3,输出本该是 253。结果屏幕跳到 252。我查了 40 分钟,最后发现是进位标志没有清。张定远如果在,大概会用那半截粉笔敲我显示器:“那个借来的 1,你还没还。”
我把 253 和 252 两个数抄在便签纸上,贴在显示器边框。每次写负数运算,先看它们一眼。补码不是魔法,是一份关于借与还的契约。模 256 的钟面上,-3 和 253 是同一个位置。你走 253 步,和我倒着走 3 步,落在同一格。
如果你也在学这里,不妨先别背口诀。找一张纸,画 8 个格子,从 00000000 慢慢数到 11111111。数到第 254 个的时候,你会遇到那个让计数器安静下来的数。它叫 11111101。像一扇门,朝里和朝外,都是同一个房间。