一. 数制和编码1. 信息的二进制编码

计算机内部处理的所有数据都必须是“数字化编码”了的数据。数字化编码的过程,就是指对感觉媒体信息进行采样,将现实世界中的连续信息转换为计算机中的离散的“样本”信息,然后对样本信息用“0”和“1”进行数字化编码的过程。

数值型数据的整理(数据的机器级表示和处理)(1)

2. 采用二进制表示法的原因
  1. 二进制只有两种基本状态,使用有两个稳定状态的物理器件就可以表示二进制数的每一位。
  2. 二进制的编码,计算和运算规则都很简单,可以用开关电路实现。
  3. 两个符号 1 和 0 正好与逻辑命题的两个值 真 和 假 相对应。

在计算机内部,数值数据的表示方法有两大类:第一类是直接用二进制数表示;另一类是采用二进制的十进制数(BCD)表示。表示一个数值数据需要确定三个要素:进位计数值,定/浮点表示和编码规则。

3. 进位计数制

日常生活中基本上都使用十进制数,其每个数位可用 10 个不同符号 0,1,2……,等表示。但在计算机系统中,常用的进位计数制有:二进制,二进制,十进制,十六进制。

数值型数据的整理(数据的机器级表示和处理)(2)

十进制小数转二进制

整数部分的转换方法是“除基取余,上左下右”。即:用要转换的十进制整数去除以基数 R,将得到的余数作为结果数据中各位的数字,直到上商为 0. 上面的余数作为右边低位的数位,下面的余数做为左边高位上的数位。

小数部分的转换方法是“乘基取整,上左下右”。即:用要转换的十进制小数去乘以基数 R,将得到的乘积的整数部分作为结果数据中各位的数字,小数部分继续与基数 R 相乘,以此类推,直到某一步乘积的小数部分为 0 或已得到希望的位数为止。最后,将上面的整数部分作为左边高位上的数位,下面的整数部分作为右边低位上的数位。

4. 定点和浮点表示定点表示

小数点位置约定在固定位置的数称为定点数。顶点表示法用来对定点小数和定点整数进行表示。对于定点小数,其小数点总是固定在数的左边(浮点数的尾数)。对于定点整数,其小数点总是固定在数的最右边。

浮点表示

小数点位置约定为可浮动的数为浮点数。

对于任意一个实数 X,可以表示为:X=(-1)S * M * RE

其中,S 取值为 0 或 1,用来决定数 X 的符号。M 是一个二进制定点小数,称为数 X 的尾数;E 是一个二进制定点整数,称为数 X 的阶或指数;R 是基数,可以取值为 2,4,16 等。

在基数 R 一定的情况下,尾数 M 的位数反映数 X 的有效位数,它决定了数的表示精度,有效位数越多,表示精度就越高;阶 E 的位数决定数 X 的表示范围;阶 E 的值确定了小数点的位置。

5. 定点数的编码表示1. 原码表示

一个数的原码表示由符号位直接跟数值位构成。因此,也称 “符号-数值” 表示法。原码表示法中,正数和负数的编码表示仅符号位不同,数值部分完全相同。

2. 补码表示

正数的补码符号为0,数值部分是其本身。

负数的补码等于模与该负数绝对值之差,即符号位为 1,数值部分取反再加一。

补码采用的是模运算,故绝对值相同的正数和负数相加会等于模 2n。

由于是模运算,绝对值相等的正数和负数关于 2n-1 对称。越靠经对称轴的值(不管正数还是负数)都越大。

由于是模运算,补码表示可以实现加减运算的统一,即用加法来实现减法运算。

数值型数据的整理(数据的机器级表示和处理)(3)

二. 整数的表示

计算机中的整数分为无符号整数和带符号整数。

无符号整数:当一个编码的所有二进制位都是用来表示数值而没有符号位时,该编码表示的就是无符号整数。此时默认数的符号为正(用于表示指针,下标等)。对应的数的值范围为 0~2n-1

带符号整数:必须有一个二进制位表示符号。n 位带符号整数的表示范围为:-2n-1 ~ 2n-1-1 。

C 语言中允许无符号整数和带符号整数之间的转换,转换前,后的机器数不变,只是转换前,后对其的解释发生了变化。

三. 浮点数的表示

浮点数是用一个定点数来表示浮点数的尾数,另一个表示浮点数的阶。由于两个定点数的位数是有限的,因而浮点数的表示范围也是有限的。 以 32 为浮点数为例:其表示为:

数值型数据的整理(数据的机器级表示和处理)(4)

image

1. 非规格化浮点数

非规格化数浮点数的偏移量是 2^7(128),即 0 的阶码为 10000000。故阶码能表示的最大数为 127,最小数为 -128。

非规格化数的位数为 24位,表示形式为:0.1bbb……b,其中第一位 1 不明显表示出来,这样可以用 23 个数来表示 24 位尾数。

非规格化浮点数的表示范围:

由上看出,正数和负数的取值范围关于 0 对称。

2. 规格化浮点数

浮点数尾数的位数决定浮点数的有效数位,有效数位越多,数据的精度越高。为了在浮点数运算过程中尽可能多地保留有效数字的位数,使有效数字尽量占满尾数数位,必须在运算过程中对浮点数进行规格化操作。

对浮点数进行规格化,除了能得到尽量多的有效数位,还可以使浮点数的表示具有唯一性。

IEEE 754 浮点标准

目前几乎所有计算机都采用 IEEE 754 标准表示浮点数。在这个标准中,提供了两种浮点格式:32 位单精度格式和 64 位双精度格式。

其基数隐含为 2,尾数用原码表示,规格化尾数第一位总为 1,因而可在尾数中缺省第一位的 1,该缺省位称为隐藏位,隐藏一位后使得单精度格式的 23 位尾数实际表示 24 位有效数字。IEEE 754 规定隐藏位 1 的位置在小数点之前。

IEEE 754 标准中,阶码用移码表示,偏置常数并不是通常的 2n-1,而是 2n-1-1,因此,单精度和双精度浮点数的偏置常数分别为 127 和 1023。

偏置常数这样选取的好处:

  1. 尾数可表示的位数多一位,因而使浮点数的精度更高。
  2. 阶码的可表示范围更大,因而使浮点数范围更大。

偏置常数为127的阶码表示范围:-126~127。 偏置常数为128的阶码表示范围:-127~126。 由于IEEE754中规定了非规格化浮点数的阶码为-126,且隐藏位表示0。 故非规格化浮点数表示的范围为:0~1.11……1*2^(-127)。 能够覆盖掉偏置常数为128中的一个子序列。故选择偏置常数为127。

数值型数据的整理(数据的机器级表示和处理)(5)

IEEE 754 各区间的表示1. 全 0 阶码全 0 尾数: 0 / -02. 全 0 阶码非 0 尾数:非规格化数。

非规格化数的特点是阶码全为 0,尾数高位有一个或几个连续的 0,但不全为 0。隐藏位为 0,并且单精度和双精度浮点数的阶分别为 -126 和 -1022,故浮点数的值分别为:(-1)s * 0.f * 2-126 和 (-1)s * 0.f * 2-1022 。

非规格化数可用于处理阶码下溢,使得出现比最小规格数还小的数时程序也能继续执行。

3. 全 1 阶码全 0 尾数: ∞ / -∞4. 全 1 阶码非 0 尾数:NaN5. 阶码非全 0 且非全 1:规格化非 0 数,