数字在计算机中的编码有原码、反码、补码、移码四种类型,每一种编码都有一定的作用,数字又有浮点数、定点数等类型,因此整理一下它们十分有必要。

基本概念 链接到标题

真值 链接到标题

人类表示数字的形式,可以是十进制也可以是二进制,负数前面有负号,例如 99D、-100B。

机器数 链接到标题

计算机存储数字的形式,只能是二进制的,如果需要的话可以用符号位来表示正负,例如 10010。

分为无符号数带符号数两类,也可以分为定点数浮点数两类。

符号位:计算机存储数字时用于表示正负的那一位,1 表示该数为负数,0 表示该数为正数。

无符号数 链接到标题

这种类型的数字只能是定点数,只能用原码表示,每一位都用于表示数字的大小,例如在八位系统下,10000000B = 128D。

整数 链接到标题

一般指带符号整数,即最高位为符号位的整数,有原码、反码、补码、移码四种编码形式,例如在八位系统原码表达下,1000001B = -1D。

定点数 链接到标题

一般指带符号纯小数,一般用原码或补码表示,例如在八位系统原码表示下,01000000B = 0.5D

定点指的是小数点的位置固定,一般为最低有效位之后(整数)或最高有效位之前(纯小数)。

浮点数 链接到标题

这一类数由阶码与尾数组成,类似人类的科学计数法,$N = 2^E * 0.M$

在本科阶段机组学习过程中,尾数是纯小数的形式,即 1000000 表示 0.10000000。但标准格式下不是这样的,详见 IEEE 754

一般有以下三种组成形式:

  1. 阶码(移码)+ 尾数(移码)
  2. 阶码(移码)+ 数符 + 尾数(补码或原码)
  3. 阶符 + 阶码(补码或原码)+ 数符 + 尾数(补码或原码)

原码 链接到标题

最高位为符号位,有效位均用二进制真值表示。例如 $[01000000]_原$ = 64D、$[10000001]_原$ = -1D。

原码较多运用于乘除运算。

反码 链接到标题

正数的反码与对应的原码一致,负数的反码是在对应的原码的基础上除符号位外取反。例如 $[01000000]_反$ = 64D、$[11111110]_反$ = -1D。

需要注意的是反码中有 +0($[00000000]_反$)和 -0($[10000000]_反$)两个 0

用的较少。

补码 链接到标题

正数的补码与对应的原码一致,负数的补码是在对应的原码基础上除符号取反加一得到的。例如 $[01000000]_补$ = 64D、$[11111111]_补$ = -1D。

在求负数补码时也可以简化为符号位与最低位开始的连续 0 与最低的 1 不变,其他位取反,例如 $[10001000]_原$ = $[11111000]_补$

$[10000000]_补$ 是一个特殊的数,它无法被同样宽度的原码表示,但却可以被补码表示。

补码可以避免反码两个 0 的问题,较多运用于加减运算。

移码 链接到标题

又叫增码或偏置码。

移码的数值位与对应的补码一致,符号位用 1 表示正数,0 表示负数。可以理解为以 $[10000000]_移$ 为轴大致对称的两部分。例如 $[11000000]_移$ = 64D、$[01111111]_移$ = -1D。

因为有像数轴类似的性质,所以移码较多运用于比较,即表示浮点数的阶码。

规格化 链接到标题

在浮点数中,为了在尾数中表示最多的有效数据位,同时使浮点数具有固定的表示方式,浮点数的编码应当采用一定的规范,即尾数调整到最高有效位与符号位相反。例如 $2^{100}*0.00100000$ 规格化后是 $2^{110}*0.10000000$。

这里又涉及到了移位操作,这个我们以后再讲。

取值范围 链接到标题

定点数的取值范围

浮点数(非规格化)的取值范围

浮点数(规格化)的取值范围