计算机中常用的数据表示格式有 定点格式和 浮点格式两种。
一般来说,定点格式容许的数据范围有限,要求的处理硬件比较简单;
浮点格式容许的数值范围很大,要求的处理硬件比较复杂。
定点数的表示
定点数,即小数点位置固定不变。
原理上,小数点的位置固定在哪一位都是可以的,但我们通常将数据表示成 纯小数 或 纯整数。
假设用 n+1 位字来表示一个定点数 x,由于约定了小数点的固定位置,就不再使用记号 “ . ”。这样,对于任意定点数 x=xnxn-1···x1x0,在定点机中可表示成如下形式:
定点小数
如果 x 表示的是纯小数,那么小数点就隐含在xn和xn-1之间。数的表示范围是0 <= |x| <= 1-2-n。
定点整数
如果 x 表示的是纯整数,那么小数点就隐含最低位x0的右边。数的表示范围是0 <= |x| <= 2n-1。
目前计算机多采用定点纯整数表示,因此将定点数表示的运算简称为整数运算。
整数的机器码表示
为了区别一般书写表示的数和机器中编码表示的数,通常我们称前者为 真值,后者为 机器数或机器码。
若真值为 x,则用[x]原、[x]反、[x]补、[x]移分别表示真值所对应的原码、反码、补码、移码。
对于正整数,原码、反码、补码完全一样。
原码
原码表示简单易懂,直接用符号位加上二进制数的绝对值即可。
反码
在原码的基础上,符号位不变,数值位按位取反。
补码
反码+1即可。
比如 -10,这个整数:
整数真值 | -10 | |||||||
---|---|---|---|---|---|---|---|---|
原码 | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 1010 |
反码 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 0101 |
补码 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 0110 |
浮点数的表示
在计算机中任意一个二进制数 N 可以写成 N=2e·M,
计算机中,机器浮点数的组成如下图:
其中M称为浮点数的尾数,通常是用原码或补码表示的定点小数;E称为阶码,通常是用补码或移码表示的定点整数。
阶码 E 反映浮点数的表示范围及小数点的实际位置;
尾数 M 的数值部分的位数反映浮点数的精度。
浮点数的规格化
如果不对浮点数的表示作出规定,同一个数的表示就不唯一。
为了提高数据表示精度,规定当尾数的值不为 0 时,尾数域的最高有效位应为 1。
当浮点数运算结果需要进行规格化处理时,将尾数 算术右移 一位,阶码减1,这种称为左规。
当浮点数运算结果尾数出现溢出(双符号位为01或10)时,将尾数算数右移一位,阶码加1,这种称为右规。
P.S. 移码
移码通常用于表示浮点数的阶码。
阶码是个k位的整数ekek-1···e1e0(最高位为符号位),则移码的传统定义是:[e]移=2k+e,2k > e >= -2k.
[e]移 为机器数,e 为真值,2k 是一个固定的偏移值常数。
移码中的逗号不是小数点,而是表示左边的一位是符号位。
移码中的符号位表示规律与原码、反码、补码相反。
浮点数的机器表示
IEEE754标准规定了32位短浮点数和64位长浮点数的标准格式为:
不论32位浮点数还是64位浮点数,由于基数 2 是固定常数,固不必采用显示的方式来表示它。
IEEE754标准规定,在计算机内部保存 M 时,默认这个数的第一位总是 1,因此可以被舍弃,只保存后面的数据;等到读取的时候,再把第一位 1 加上,这样可以节省一位有效数字。
在32位浮点数中,S 是浮点数的符号位;M 是尾数,占 23 位,小数点位置在尾数域最左(最高)有效位的右边;E 是阶码,占 8 位,采用隐含方式表示,即移码。将浮点数的指数的真值 e 变成阶码 E 时,应将指数 e 加上一个固定的偏置常数 127,即 E=e+127.
一个规格化的 32 位浮点数 x 的真值表示x = (-1)S·(1.M)·2E-127.
64位的浮点数中,符号位 1 位,阶码域 11 位,尾数域 52 位,指数偏移值时 1023。
一个规格化的 64 位浮点数 x 的真值表示x = (-1)S·(1.M)·2E-1023.
浮点数表示一些小数的时候并没有那么精确,