原码:最直观的符号化表示
原码是负数二进制表示的“雏形”,其设计逻辑简单直接:用最高位作为符号位,0表示正数,1表示负数,数值部分则与该数绝对值的二进制形式全一致。例如,在8位二进制系统中:- 正数+5的原码是 `00000101`符号位0,数值位0000101;
- 负数-5的原码是 `10000101`符号位1,数值位0000101。
但原码存在致命缺陷:符号位与数值位分离,导致加减运算复杂。例如计算1+(-1),原码相加为 `00000001 + 10000001 = 10000010`,结果是-2,显然错误。更尴尬的是,0会出现“+0”00000000和“-0”10000000两种表示,浪费存储空间。
反码:对原码的初步修正
为决原码运算问题,反码应运而生。其规则是:正数的反码与原码相同;负数的反码则是符号位不变,数值位按位取反。以-58位为例: - 原码:`10000101` → 符号位1不变,数值位0000101取反为1111010 → 反码:`11111010`。 反码一定程度上优化了运算:1的反码是 `00000001`,-1的反码是 `11111110`,两者相加得 `11111111`,这正是-0的反码。但问题仍未彻底决:-0依然存在,且多位数运算时需处理“循环进位”,逻辑复杂。
- 反码:`11111010` → 加1后补码:`11111011`。 补码彻底决了原码和反码的问题: 1. 消除-0:+0和-0的补码均为 `00000000`-0反码是11111111,加1后溢出为00000000; 2. 加减统一为加法:论正数负数,直接相加即可。例如3+(-2): - 3的补码:`00000011`; - -2的补码:`11111110`原码10000010→反码11111101→加1得11111110; - 相加:`00000011 + 11111110 = 100000001`,截断8位后为 `00000001`即1,结果正确。
补码:计算机的“通用语言”
真正让负数二进制运算可行的是补码。补码的核心逻辑是:正数的补码与原码一致;负数的补码等于其反码加1。以-58位为例:补码的本质是模运算:n位二进制的模是 (2^n),负数-x的补码等于模减去x。例如8位二进制模为256,-5的补码 = 256 - 5 = 251,即 `11111011`。这种设计让减法a-b转化为加法a + (模-b),极大简化了计算机硬件电路。
从原码的直观到补码的高效,负数的二进制表示始终遵循“简化运算”的核心目标。如今,补码已成为计算机处理负数的标准方式——它用数学逻辑隐藏了符号的复杂性,让0和负数在二进制世界中实现了统一的运算规则。
