原码反码补码全面解析 📅 2026/6/25 17:49:57 原码、反码、补码详解1. 基本概念与定义在计算机中数值以二进制形式存储。为了表示有符号数正数和负数发展出了原码、反码和补码三种编码方式。现代计算机系统普遍采用补码作为整数存储和运算的标准。1.1 机器数与真值真值带符号的十进制数本身如5、-3。机器数真值在计算机中的二进制表示形式。其最高位最左边为符号位0表示正1表示负其余位为数值位。2. 三种编码方式详解2.1 原码 (Sign-Magnitude)原码是最直观的表示方法符号位加上绝对值的二进制形式。定义最高位为符号位其余位表示数值的绝对值。表示范围对于n位二进制数范围为[-(2^(n-1)-1), (2^(n-1)-1)]。例如8位原码的范围是[-127, 127]。特点直观符合人类思维。存在0(00000000) 和-0(10000000) 两种零的表示造成歧义和资源浪费。加减法运算复杂需要判断符号位硬件电路设计繁琐。示例8位原码表示十进制真值原码二进制50000 0101-51000 010100000 0000-01000 00002.2 反码 (Ones‘ Complement)反码是为了解决原码运算问题而引入的过渡方案正数的反码是其本身负数的反码是其原码符号位不变数值位按位取反。定义正数反码 原码。负数符号位不变数值位按位取反0变11变0。表示范围与n位原码相同[-(2^(n-1)-1), (2^(n-1)-1)]。特点同样存在0(00000000) 和-0(11111111) 的问题。减法可以转换为加法但运算后可能产生循环进位需要额外处理即“循环进位”加回到最低位硬件实现仍不完美。示例8位反码表示十进制真值原码反码50000 01010000 0101-51000 01011111 10102.3 补码 (Two‘s Complement)补码是现代计算机中整数表示的标准方式它完美解决了原码和反码的问题。定义正数补码 原码。负数反码 1。等价于该负数的绝对值对应的二进制数所有位按位取反后加1。表示范围对于n位二进制数范围为[-2^(n-1), (2^(n-1)-1)]。例如8位补码的范围是[-128, 127]比原码和反码多表示一个数-128。核心优势0的唯一表示0和-0的补码都是00000000消除了歧义。统一加减法减法运算可以转换为加法运算无需额外的硬件判断逻辑。符号位可以像数值位一样参与运算简化了CPU的算术逻辑单元(ALU)设计。模运算的自然结果补码的本质是模运算。对于n位二进制模为2^n。一个负数X的补码正是2^n - X的二进制表示。这使得加法器在溢出时自动实现了模运算的结果。示例8位补码表示与转换十进制真值原码反码补码计算过程负数50000 01010000 01010000 0101--51000 01011111 10101111 1011反码(11111010) 1 1111101100000 00000000 00000000 0000--01000 00001111 1111(1)0000 0000(溢出丢弃) → 0000 0000--128无法表示无法表示1000 0000128 2^7直接对应补码定义3. 编码方式对比与应用| 特性 | 原码 | 反码 | 补码 || :--- | :--- | :--- | :--- ||正数表示| 符号位0 绝对值 | 与原码相同 | 与原码相同 ||负数表示| 符号位1 绝对值 | 符号位不变数值位取反 | 反码 1 ||零的表示|0和-0两种 |0和-0两种 | 唯一 (000...0) ||表示范围 (n位)| [-(2^(n-1)-1), (2^(n-1)-1)] | 同原码 | [-2^(n-1), (2^(n-1)-1)] ||加减法运算| 复杂需判断符号 | 可转换但有循环进位 |统一为加法最简便 ||硬件实现| 复杂 | 较复杂 |简单高效||现代应用| 基本淘汰 | 基本淘汰 |整数运算标准|4. 补码运算实例补码的核心优势在于将减法变为加法。运算时所有操作数均以补码形式参与结果也是补码。示例计算 75 (使用8位补码)转换为补码7的补码0000 0111-5的补码1111 1011(如上表)执行加法运算a 0b00000111 # 7的补码 b 0b11111011 # -5 的补码 result (a b) 0xFF # 加法并取低8位模拟溢出截断 print(bin(result)) # 输出: 0b10 - 0b00000010 (高位溢出丢弃)解读结果0000 0010是2的补码因此7 - 5 2。示例计算 -3 4转换为补码-3的原码1000 0011反码1111 1100补码1111 1101-4的原码1000 0100反码1111 1011补码1111 1100执行加法运算result (a b) 0xFF print(bin(result)) # 输出: 0b11111001 将结果补码1111 1001转换回十进制符号位为1是负数。数值位取反0000 0110。加10000 0111 7。因此原数是-7。验证(-3) (-4) -7。5. 扩展知识移码移码主要用于浮点数的阶码指数表示如 IEEE 754 标准。定义在补码的基础上将符号位取反。即移码 补码 2^(n-1)对于n位数。目的使所有指数的机器数都表现为正数便于浮点数比较大小。示例8位移码偏移量128(2^7)。十进制真值补码移码 (补码符号位取反)50000 0101|1000 0101| | -5 |1111 1011|0111 1011 |6. 编程语言中的实践在高级编程语言如 Java、C、C、Python中程序员通常直接使用有符号整数类型如int编译器或解释器会自动处理补码的转换和运算。// Java 示例展示负数的补码表示 public class TwosComplementDemo { public static void main(String[] args) { int positive 5; int negative -5; System.out.println(十进制 5: positive); System.out.println(二进制(补码): Integer.toBinaryString(positive)); // 输出: 101 (省略前导0) System.out.println(十进制 -5: negative); // 输出5 的32位补码表示 System.out.println(二进制(补码): Integer.toBinaryString(negative)); // 输出: 11111111111111111111111111111011 } }在 Java 中Integer.toBinaryString()方法返回的是整数补码表示的二进制的字符串形式对于负数是完整的32位补码。参考来源原码-反码-补码的详细解释关于二进制的原码 、反码、补码的简要解释说明原码反码补码解释原码反码补码移码四种码详细解释计算机原码、反码、补码是什么解释题目练习