补码、反码、移码
笔试面试经常被问到补码、反码、移码的相关题目。咨询 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.