毫无疑问,正数是要从 1 开始枚举的(0是正数),每次枚举一个数,我们相应的可以计算出他的一个补数,直到我们遇到了正负数形式相同的 128。(对应之前 0~9 范围的 5)
128 应该划分为正数还是负数(正数的补数)?之前我们直接给出了结论,现在来说明为什么。
如果你将 0 ~ 255 这 256 个数使用二进制形式全部枚举出来,你将得到两堆数,第一堆是最高位 0 开始的:0000 0000 ~ 0111 1111,表示范围 0~127,而另一堆是最高位以 1 开始:1000 0000 ~ 1111 1111,对应范围 128 ~ 255;计算机似乎发现了一个绝妙的方法用来辨识一个二进制数的正负,那就是查看最高位,如果一个(有符号)二进制数最高位为 1 ,那么就认为它代表一个负数,如果最高位为 0 ,那么它就为一个正数。这种规则简单且高效。唯一的问题就是,一旦应用这种规则,那么我们之前疑惑的 128 (1000 0000),就不得不成为一个补数了。不过这样也很优雅,将表数范围正好分为两个相等的部分,
0 和 正数共 128 个数,范围 \(0~127\) (0000 0000 ~ 0111 1111);
补数(表示负数)128 个,范围 \(-128~-1\) (1000 0000 ~ 1111 1111);
将他们分布到一个表盘上:
从 0000 0000 (表示 0) 顺时针旋转,正数取值不断变大,直到与 1000 0000 右侧紧邻的 0111 1111 (表示正数 127)。
从 1000 0000 (表示 -128)顺时针旋转,负数取值不断变大,直到 0000 0000 左侧紧邻的 1111 1111(表示负数 -1)。
后记写这篇文章之前,我以为我真的懂了补码的概念,可当我真正想努力给别人阐述清楚我是怎样想的和事实应该是怎样的时候,我发现,我知道的与我以为我知道的,相差很多。我不能简洁明了的表达我所想的,可能是文笔不行,也有可能是我只是多知道了一点,却以为是一个飞跃,然后试图将这个飞跃真实的描绘出来。而实际呢,恐怕是一个残缺、粗糙的模型,在脑海中丰满无比,一旦将其一丝不苟的描述出来,就会发现竟是漏洞百出。可能我们总是喜欢乐观的高估自己吧(能力错觉)。当然完成这篇文章后,我也收获了比预期更多的东西。
去写作也许就是基于这样的目的,能真切的让人认清自己,与自己对话,沉淀自己,变得凝实,避免虚浮。
修修改改写了好几天,总觉得逻辑似乎有些问题。如果有什么问题,欢迎指正。