【计算机组成原理-19】原码、反码、补码和移码

原码、反码、补码和移码

原码反码补码移码 是计算机中表示整数(特别是带符号整数)的一些编码方式。它们是为了方便在计算机中处理整数的符号和数值范围而设计的。不同的编码方式有不同的表示规则和数学运算性质。

我们先来了解它们各自的定义和特点,再进行对比。


1. 原码(Sign-Magnitude)

原码 是一种最简单的整数表示方式,它将整数分为符号位和数值部分。

  • 符号位:表示数值的正负。一般约定,符号位为 0 表示正数,符号位为 1 表示负数。
  • 数值部分:表示该数值的绝对值,用二进制表示。
示例:

对于 8 位原码表示,最高位是符号位,剩余 7 位表示数值。

  • 正数 +5 的原码表示:

    0 0000101   // 符号位 0 表示正数,数值部分表示 5
    
  • 负数 -5 的原码表示:

    1 0000101   // 符号位 1 表示负数,数值部分表示 5
    

特点

  • 原码的表示方法简单直观,但其加减法运算较为复杂,需要特别处理符号位。
  • 存在两个零的表示:正零(00000000)和负零(10000000)。

2. 反码(One's Complement)

反码 是对原码的改进,主要是为了简化加减运算的过程。在反码表示中,负数是通过对正数的原码进行逐位取反得到的。

  • 正数的反码与原码相同。
  • 负数的反码通过将原码的每一位取反得到。
示例:

对于 8 位反码表示:

  • 正数 +5 的反码表示:

    0 0000101   // 正数与原码相同
    
  • 负数 -5 的反码表示:

    1 1111010   // 负数反码是原码逐位取反
    

特点

  • 反码可以方便地进行加减法运算,但仍然存在两个零的表示:正零(00000000)和负零(11111111)。
  • 加法和减法运算时需要特别处理符号位。

3. 补码(Two's Complement)

补码 是最常用的整数表示法,它解决了反码存在的两个零问题,并且简化了加减法运算。补码的表示规则是:

  • 正数的补码与原码相同。
  • 负数的补码通过对反码加 1 得到。
示例:

对于 8 位补码表示:

  • 正数 +5 的补码表示:

    0 0000101   // 正数与原码相同
    
  • 负数 -5 的补码表示:

    • 先求原码:10000000 表示 -128(最小负数)
    • 求反码:11111010
    • 然后加 1 得到补码:11111011
    1 1111011  // 负数补码为原码的反码 + 1
    

特点

  • 补码是目前计算机中最常用的表示法,尤其在 CPU 的算术运算中。
  • 唯一的零表示:00000000 表示零,消除了原码和反码中出现的两个零问题。
  • 由于补码可以直接用于加法和减法运算,因此硬件实现更高效。
  • 负数的补码表示范围比原码和反码要大。比如,8 位补码可以表示的范围是从 -128127

4. 移码(Excess-K or Bias)

移码 是一种常用于表示浮点数的编码方法,也可以用于整数的表示。移码将整数值 X 转换为偏移量加上原数值,即通过将数值加上一个常数偏移量 K,从而消除符号位。

  • 偏移量 K 是根据表示范围来确定的,一般选择 K = 2^(n-1) - 1,其中 n 是位数。
  • 对于一个数值 X,它的移码表示为 X + K
示例:

对于 8 位移码表示,偏移量 K127,即 2^(8-1) - 1 = 127

  • 正数 +5 的移码表示:

    5 + 127 = 132   // 00000101 + 127 -> 132 (10000100)
    
  • 负数 -5 的移码表示:

    -5 + 127 = 122   // 11110111
    

特点

  • 移码的优点是它使得零可以只有一个表示(没有正零和负零的困扰)。
  • 由于移码与补码的概念类似,因此它的加法运算较为简单,常用于浮点数的指数部分。

对比原码、反码、补码、移码

特性原码反码补码移码
表示范围-128 到 127-127 到 127-128 到 1270 到 2^(n-1) - 1
零的表示正零和负零正零和负零唯一的零唯一的零
符号位符号位 + 数值部分符号位 + 反码符号位 + 补码移码值(加偏移量)
加法/减法需要特殊处理需要特殊处理可以直接运算可以直接运算
运算复杂性

总结

  • 原码:简单直观,但加减法运算复杂,存在两个零的表示。
  • 反码:简化了加法运算,但仍然存在两个零的问题。
  • 补码:最常用的表示方式,简化了加法和减法的运算,同时消除了两个零的问题。
  • 移码:通常用于浮点数表示,使用一个偏移量来消除符号位,简化运算。

补码是最常见的表示方式,尤其在计算机硬件中,几乎所有的计算都是基于补码运算进行的。

### 计算机组成原理学习笔记 #### 原码补码反码移码的概念及其相互转换 在计算机科学中,为了有效地处理正负数并简化硬件设计,引入了几种不同的编码方式来表示二进制数据。 - **原码 (Sign-Magnitude Representation)** 是最直观的一种形式,在这种模式下最高位作为符号位用来区分正负;其余各位则直接对应绝对值的二进制表达。对于八位机器而言,+7会被记作`0000 0111`而−7则是`1000 0111`[^1]。 - **反码 (One's Complement)** 的定义是在已知某个数X的原码基础上得到其相反数Y的方法之一:当X为正时保持不变;如果X是负数,则除了首位外其他所有位置上的比特都要翻转(即由0变1或反之)。例如十进制整数-14使用反码表示就是 `1111 0001`。 - **补码 (Two's Complement)** 提供了一种更加高效的解决方案用于加减运算操作。它基于这样的原则——任何给定字长n内的有符号整数Z都可以通过将其对应的无符号数值加上\(2^{(n)}\) 来获得。具体来说,求得一个数N的补码可以先计算它的反码再对该结果整体加一。因此,-14采用8-bit存储格式下的补码应写作`1111 0010`。 - **移码 (Bias Representation)** 主要应用于浮点数规格化过程中指数部分的表现上。简单理解的话,就是在原有真值的基础上增加了一个固定的偏置量bias从而使得所有的可能取值都变为正值范围之内便于比较大小关系。比如IEEE标准规定单精度float类型的E字段实际意义等于e+bias其中bias=127;双精度double里边相应地设定了另一个更大的常数1023作为偏置因子。 ```python def get_complements(value, bits): """获取指定长度bit位的原码/反码/补码""" if value >= 0: original_code = bin(value)[2:].zfill(bits) one_complement = ''.join(['1' if b=='0' else '0' for b in original_code]) two_complement_int = int(one_complement, 2) + 1 two_complement_bin = bin(two_complement_int)[2:].zfill(bits)[-bits:] return { "original": f"0{original_code}", "one_comp": f"{''.join('1' if c == '0' else '0' for c in ('0'+original_code))}", "two_comp": f"{two_complement_bin}" } else: abs_val = abs(value) original_code = bin(abs_val)[2:].zfill(bits) one_complement = ''.join(['1' if b=='0' else '0' for b in original_code]) two_complement_int = int(one_complement, 2) + 1 two_complement_bin = bin(two_complement_int)[2:].zfill(bits)[-bits:] return { "original": f"1{original_code}", "one_comp": f"1{''.join('1' if c == '0' else '0' for c in original_code)}", "two_comp": f"{'{:0%db}' % bits.format(int(not bool(value<0))*int(original_code,2)+(value<0)*two_complement_int)}" } print(get_complements(-14, 8)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值