计算机内部处理的所有数据都必须是“数字化编码”了的数据。数字化编码的过程,就是指对感觉媒体信息进行采样,将现实世界中的连续信息转换为计算机中的离散的“样本”信息,然后对样本信息用“0”和“1”进行数字化编码的过程。
在计算机内部,数值数据的表示方法有两大类:第一类是直接用二进制数表示;另一类是采用二进制的十进制数(BCD)表示。表示一个数值数据需要确定三个要素:进位计数值,定/浮点表示和编码规则。
3. 进位计数制日常生活中基本上都使用十进制数,其每个数位可用 10 个不同符号 0,1,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 对称。越靠经对称轴的值(不管正数还是负数)都越大。
由于是模运算,补码表示可以实现加减运算的统一,即用加法来实现减法运算。
计算机中的整数分为无符号整数和带符号整数。
无符号整数:当一个编码的所有二进制位都是用来表示数值而没有符号位时,该编码表示的就是无符号整数。此时默认数的符号为正(用于表示指针,下标等)。对应的数的值范围为 0~2n-1
带符号整数:必须有一个二进制位表示符号。n 位带符号整数的表示范围为:-2n-1 ~ 2n-1-1 。
C 语言中允许无符号整数和带符号整数之间的转换,转换前,后的机器数不变,只是转换前,后对其的解释发生了变化。
三. 浮点数的表示浮点数是用一个定点数来表示浮点数的尾数,另一个表示浮点数的阶。由于两个定点数的位数是有限的,因而浮点数的表示范围也是有限的。 以 32 为浮点数为例:其表示为:
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。
偏置常数这样选取的好处:
偏置常数为127的阶码表示范围:-126~127。
偏置常数为128的阶码表示范围:-127~126。
由于IEEE754中规定了非规格化浮点数的阶码为-126,且隐藏位表示0。
故非规格化浮点数表示的范围为:0~1.11……1*2^(-127)。
能够覆盖掉偏置常数为128中的一个子序列。故选择偏置常数为127。
非规格化数的特点是阶码全为 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 数,