数的编码表示中,反码、补码和移码是计算机内部对有符号数进行表示与运算的重要方式

数的编码表示中,反码、补码和移码是计算机内部对有符号数进行表示与运算的重要方式,而定点数与浮点数则是数值在计算机中的两种基本存储形式。

(1)反码

  • 最高位为符号位:0 表示正数,1 表示负数。
  • 正数的反码与其原码相同;
  • 负数的反码是对该数绝对值的各位(除符号位)按位取反。
  • 例如:8 位机器中,[-5]原 = 10000101,[-5]反 = 11111010。
  • 存在 +0 和 -0 两种表示:[+0]反 = 00000000,[-0]反 = 11111111,不利于判断相等。

(2)补码

  • 解决了反码中零的双重表示问题,并简化了减法运算(通过加补码实现减法)。
  • 整数补码定义(n 位):
    • 正数:[X]补 = X(范围:0 ≤ X ≤ 2ⁿ⁻¹−1)
    • 负数:[X]补 = 2ⁿ + X(范围:−2ⁿ⁻¹ ≤ X < 0)
  • 小数补码定义:
    • 正数:[X]补 = X(0 ≤ X < 1)
    • 负数:[X]补 = 2 + X(−1 ≤ X < 0)
  • 特点:
    • 正数补码 = 原码 = 反码;
    • 负数补码 = 反码末位 +1;
    • 零唯一:[+0]补 = [-0]补 = 00000000;
    • 模运算思想支持加减统一处理。

(3)移码

  • 主要用于浮点数的阶码表示,便于比较大小(特别是指数部分)。
  • 定义(n 位整数):[X]移 = 2ⁿ⁻¹ + X,其中 −2ⁿ⁻¹ ≤ X < 2ⁿ⁻¹
  • 小数移码:[X]移 = 1 + X,−1 ≤ X < 1
  • 特点:补码的符号位取反即得移码。例如 [X]补 = 00001100,则 [X]移 = 10001100。
  • 移码表示中,数值越大,编码越大,适合做阶码比较。

2. 定点数与浮点数

  • 定点数:小数点位置固定不变。

    • 分为两类:
      1. 定点整数:小数点隐含在最低位之后,仅表示整数;
        • 如:n 位补码定点整数范围为:−2ⁿ⁻¹ 到 2ⁿ⁻¹−1
      2. 定点小数:小数点隐含在符号位之后,用于表示 −1 到 +1 之间的实数;
        • 如:[X]补 = 1.101 表示 −0.101₂ = −0.625
    • 优点:运算简单、速度快;
    • 缺点:表示范围有限,精度固定。
  • 浮点数:小数点位置不固定,采用科学计数法表示:

    • 形式:N = M × Rᴱ
      • M:尾数(mantissa),表示数的精度;
      • E:指数(阶码),表示小数点位置;
      • R:基数(通常为 2,在计算机中隐含)
    • IEEE 754 标准常用格式:
      • 单精度(32 位):1 位符号 + 8 位阶码(移码)+ 23 位尾数
      • 双精度(64 位):1 位符号 + 11 位阶码 + 52 位尾数
    • 浮点数能表示极大或极小的数,但存在舍入误差,运算复杂度高。
      将一个负整数转换为8位二进制补码表示,可以按照以下步骤进行:

步骤详解:

  1. 确定绝对值的原码
    先写出该负数绝对值的8位二进制形式(即正数的原码)。

  2. 求反码
    对该正数原码的每一位(除符号位外,但此处是正数,尚未有符号位),按位取反,得到其反码。实际上,对于负数,我们直接对绝对值的二进制各位取反。

  3. 求补码
    在反码的基础上末位加 1,得到补码。


示例:将 -5 转换为8位二进制补码

  1. |−5| = 5,5 的二进制表示为:00000101(8位原码)

  2. 求反码(按位取反):
    11111010

  3. 末位加 1:
    11111010 + 1 = 11111011

✅ 所以:[−5]补 = 11111011


快速验证法(公式法):

根据补码定义:
对于 n 位机器,负数 [X]补 = 2ⁿ + X
这里 n = 8,X = −5:

[−5]补 = 2⁸ + (−5) = 256 − 5 = 251
251 的二进制是:11111011(与上述结果一致)


注意事项:

  • 最高位为 1,表示负数;
  • 补码中零唯一:[0]补 = 00000000;
  • 可直接用于加减运算,无需单独处理符号。
# Python 示例(注意:Python 中整数默认无限长,需手动截取低8位)
def to_8bit_twos_complement(n):
    if n >= 0:
        return format(n, '08b')
    else:
        return format((1 << 8) + n, '08b')  # 2^8 + n

print(to_8bit_twos_complement(-5))  # 输出: 11111011

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值