Post

补码、反码、移码

笔试面试经常被问到补码、反码、移码的相关题目。咨询 chatgpt 后总结如下。

补码、反码和移码都是用于表示整数的编码方式,特别是计算机在存储和操作负数时所使用的编码方法。

反码

反码(One’s Complement)是一种负数表示法,用于将负数的表示通过翻转每一位实现。其规则如下:

  • 正数的反码与原码相同。
  • 负数的反码是将其正数的二进制表示中的每一位取反(0 变 1,1 变 0)。

示例

假设用 8 位二进制表示数字。

  • +5 的二进制原码是 0000 0101,反码也是 0000 0101
  • -5 的反码是 1111 1010(将 0000 0101 中每一位取反)。

特点

反码的表示方式比较简单,但它存在“正零”和“负零”两种表示形式(例如 8 位中正零是 0000 0000,负零是 1111 1111),可能会导致计算复杂化。

补码

补码(Two’s Complement)是计算机中最常用的负数表示方式。它的规则是:

  • 正数的补码与原码相同。
  • 负数的补码是其正数的反码加 1。

示例

继续以 8 位二进制为例。

  • +5 的补码是 0000 0101
  • -5 的补码:首先将 5 的二进制 0000 0101 取反得到 1111 1010,然后加 1 得到 1111 1011

特点

补码避免了反码中的“正零”和“负零”问题(只有一种零),因此在加减法计算时更为简单直接,是目前计算机中普遍采用的表示方法。

移码

移码(Excess-K 或者 Bias-K Code)是一种用于表示有符号数的偏移编码。通常将所有数都加上一个固定的偏移量 ( K ) 后再进行表示。例如,8 位移码的偏移量通常选为 ( K = 127 )(即 2 的 7 次方减 1)。

规则

  • 负数和正数都通过在原数基础上加上偏移量 ( K ) 表示。

示例

如果采用 8 位移码,偏移量为 127。

  • +5 的移码:5 + 127 = 132,二进制为 1000 0100
  • -5 的移码:-5 + 127 = 122,二进制为 0111 1010

特点

移码适用于浮点数指数部分的编码,有利于比较和排序,因为移码表示的数值是单调递增的,适合快速比较大小。

总结

  • 反码:取反表示负数,有正零和负零的缺点,较少使用。
  • 补码:目前最常用的负数编码,消除了正零和负零的歧义。
  • 移码:用于浮点数的指数编码,通过偏移量保持单调顺序,便于大小比较。
This post is licensed under CC BY 4.0 by the author.