首页/计算机组成原理/02-data-representation/定点数的表示 🔗 在 Obsidian 中打开
计算机组成原理 · 02-data-representation

定点数的表示

重要度 ⭐⭐⭐⭐⭐反码补码移码定点数编码
速查
原码:符号位 + 绝对值;反码:负数按位取反;补码:负数 = 反码 + 1,0 唯一、多表示 $-2^n$;移码:补码符号位取反(用于阶码,可直比大小)。补码表示范围 $-2^n \sim +(2^n-1)$,8 位补码 -128 ~ +127

概述

定点数是指小数点位置固定的数,分为定点整数(小数点在最低位之后)和定点小数(小数点在符号位之后)。原码、反码、补码、移码是四种常用的编码方式。

原码

定义

  • 最高位为符号位:0 正 1 负;其余位为数值的绝对值。
  • 真值 $X$ 的原码记为 $[X]_{原}$。

定点整数原码

$X = +1011$,则 $[X]_{原} = 0,1011$;$X = -1011$,则 $[X]_{原} = 1,1011$。

n+1 位原码表示范围:$-(2^n-1) \sim +(2^n-1)$

定点小数原码

$X = +0.1011$,则 $[X]_{原} = 0.1011$;$X = -0.1011$,则 $[X]_{原} = 1.1011$。

原码小数表示范围:$-(1-2^{-n}) \sim +(1-2^{-n})$

原码的特点

  • 直观,与真值转换简单。
  • 0 有两种表示:$+0 = 00000$,$-0 = 10000$。
  • 加减运算复杂,需要判断符号。

反码

定义

  • 正数:反码 = 原码。
  • 负数:符号位不变,其余位取反

转换示例

$X = +1011 \rightarrow [X]_{反} = 0,1011$;$X = -1011 \rightarrow [X]_{反} = 1,0100$。

反码的性质

  • 0 有两种表示:$[+0]_{反} = 00000$,$[-0]_{反} = 11111$。
  • 反码的反码 = 原码。
  • 反码是补码的过渡形式,实际中较少直接使用。

补码(最重要)

定义

  • 正数:补码 = 原码。
  • 负数:补码 = 反码 + 1(末位加 1)。
  • 快速法:从最低位开始找到第一个 1,该位及其右边不变,左边(不含符号位)取反。

定点整数补码

$X = +1011 \rightarrow [X]_{补} = 0,1011$;$X = -1011 \rightarrow [X]_{反} = 1,0100 \rightarrow [X]_{补} = 1,0101$。

n+1 位补码表示范围:$ -2^n \sim +(2^n-1)$,比原码多表示一个负数 $-2^n$。

定点小数补码

$X = +0.1011 \rightarrow [X]_{补} = 0.1011$;$X = -0.1011 \rightarrow [X]_{补} = 1.0101$。

小数补码表示范围:$-1 \sim +(1-2^{-n})$;-1 的补码为 $1.000...0$。

补码的优势

  • 0 的表示唯一:$[+0]_{补} = [-0]_{补} = 00000$。
  • 加减运算统一:减法可转换为加法,硬件实现简单。
  • 多表示一个数:可表示 $-2^n$(最小负数)。
  • 现代计算机普遍采用补码。

补码与原码的转换

  • 正数:原码 = 反码 = 补码。
  • 负数:原码 → 取反加 1 → 补码;补码 → 取反加 1 → 原码。

补码的数学定义

[X]补 = 2^(n+1) + X   (mod 2^(n+1)),X 为负整数
[X]补 = 2 + X          (mod 2),      X 为负小数

移码

定义

  • 移码 = 补码的符号位取反;或移码 = 真值 + 偏置值(通常偏置值 $= 2^n$)。

示例

$X = +1011 \rightarrow [X]_{补} = 0,1011 \rightarrow [X]_{移} = 1,1011$;$X = -1011 \rightarrow [X]_{补} = 1,0101 \rightarrow [X]_{移} = 0,0101$。

移码的特点

  • 移码的大小可以直接比较(与真值大小顺序一致)。
  • 0 的移码表示唯一:$[0]_{移} = 1,00...0$(即偏置值 $2^n$ 本身,8 位时 $[0]_{移} = 10000000$)。
  • 用于浮点数的阶码表示。
  • 移码全 0 表示最小负数,全 1 表示最大正数。

四种编码对比总结

编码正数负数0 的表示特点
原码不变符号 + 绝对值$\pm0$ 两种直观,运算复杂
反码不变除符号外取反$\pm0$ 两种过渡编码
补码不变反码 + 1唯一最常用,加减统一
移码补码符号取反补码符号取反唯一用于阶码,可直接比较

特殊编码值

8 位补码

最大正数:01111111 = +127
最小负数:10000000 = -128
-1:       11111111
0:        00000000

补码的符号扩展

  • 正数:高位补 0;负数:高位补 1。
  • 例:8 位补码 10101010 → 16 位 1111111110101010。

定点数的表示范围

编码n+1 位整数范围n+1 位小数范围
原码$-(2^n-1) \sim +(2^n-1)$$-(1-2^{-n}) \sim +(1-2^{-n})$
反码$-(2^n-1) \sim +(2^n-1)$$-(1-2^{-n}) \sim +(1-2^{-n})$
补码$-2^n \sim +(2^n-1)$$-1 \sim +(1-2^{-n})$

易错点

  1. 补码比原码/反码多表示一个负数($-2^n$ 或 $-1$)。
  2. 补码 0 的表示唯一,原码和反码 0 有两种表示。
  3. 移码 = 补码符号位取反,实际计算时取反比加偏置更快。
  4. 符号扩展时负数补码要补 1,不是补 0。
  5. 最小负数没有对应的正数(溢出)。
  6. 8 位补码能表示 -128 ~ +127,不是 -127 ~ +127。

记忆卡片

补码怎么由原码得到?
负数补码 = 原码取反加 1(符号位不变);快速法:从低位找第一个 1,其右不变、左取反。
原码/补码 0 的表示?
原码、反码:$\pm0$ 两种(如 8 位 ±00000000 差符号位);补码、移码:0 唯一。
8 位补码的范围?
-128 ~ +127(多表示一个 -128 = 10000000)。
负数补码符号扩展补什么?
补 1(高位全补 1);正数补 0。
移码怎么得?有什么用途?
补码符号位取反 = 真值 + $2^n$;用于浮点阶码,可直接比较大小。

交互动画 · 四种编码位域对照

同一直值在四种编码下的 5 位位域(竖虚线框 = 符号位) 符号8421 原码 $[X]_{原}$ 反码 $[X]_{反}$ 补码 $[X]_{补}$ 移码 $[X]_{移}$ 00000 00000 00000 00000 0,1011 0,1011 0,1011 1,1011 右侧列为该行编码结果(前导逗号前为符号位) 注意:+0 / -0 在原码、反码中不同,在补码、移码中相同(0 唯一)
点击真值,观察四种编码的位域与符号位
点击按钮开始

相关知识点

fixed-point-arithmetic floating-point-and-ieee754 fixed-and-floating-point

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。