数据格式
计算机中常用的数据表示格式两种:一种是定点格式,二是浮点格式。
定点格式的表示方法
定点格式就是约定机器中所有数据的小数点位置是固定不变的。数据分成纯小数或纯整数。
假设用一个n+1位字来表示一个定数X,其中一位Xn用来表示数的符号,其余位数代表他的量值。
Xn |
Xn-1 Xn-2 ....... X1 X0 |
符号 |
量值(尾数) |
如果数x表示纯小数,那么小数点位于Xn和Xn-1之间。
0<= |X| <=1-2^(-n)
如果数x表示纯整数,那么小数点位于X0右侧,则数x的取值范围是:
0 <= |X| <= (2^n)-1
浮点表示方法
浮点表示法:把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示。相当于数的小数点位置可以随着比例因子的不同在一定范围内浮动。
Es |
Em-1 ··· E1 E0 |
Ms |
Mn-1 ··· M1M0 |
阶符 |
阶码 |
数符 |
尾数 |
阶码:阶码是整数,阶符和 m 位阶码的数值部分共同反映 浮点数的表示范围及小数点的实际位置 ,常用移码或补码表示。IEEE754标准中采用移码的表示形式。
原码的表示方法
其中[x]原 是机器数,其中x是真值。
原码为简单直观的二进制表示的一个编码形式。规定原码的最高位也就是首位为符号位,正数为0,负数为1。
至于2n - x = 2^n + |x| ,因为记住2的n次方后面是n个0,即2的n次方就是1后面n个0,因为x转化为2进制后是0-n-1位,所以加上2的n次方,就是1后面加上x的真值对应的二进制编码。
补码的表示方法
对于为什么x<=-2^n
是以为补码的0(正负)都是一样的,都是用的0000 0000 这个编码,而在原码中+0的原码是 0000 0000 那么-0的原码是 1000 0000,所以在补码中就空出来一位,那么空出来的这一位就分给了最小位数,为什么是最小位数。因为空出来的这个码符号位是1即为负数。
补码的表示原理为:减去一个数,等于加上这个数的补数。
说到补码的补数,这个有一个‘模’的概念,‘模’表示被丢掉的数值。以时钟为例:一圈12个小时,当满12后即变为1,假设现在的标准时间为4点正,而有一只表已经7点了,为了校验时间,可以采用两种方法:第一种是时针退3格,即7-3=4,第二种是将时针前拨 12-3=9格。这俩方法都能对准4点。
用公式表示:
-3=+9 (mod 12)
对于X和Y来讲
[X±Y]补 = [X]补 ± [Y]补(mod2)
小数的模为2原因:
假设一个4位的二进制的计数器,那么计算机的容量 M = 2^4 = 16即模为16
而对于纯小数a来讲|a|<1,-1<a<1,可见纯小数的合法取值空间长度为2,既模为2。
负数原码求补码的方法:
符号位1不变,整数的每一个二进制都取反,然后在最低位加一。即”符号位不变,按位取反,末尾加一“
对一个原码,符号位不变,从右向左看,遇见的第一个位数为1的时候,下一位后的每一位(除符号位)全部取反。
例子:
真值 |
原码 |
补码 |
1 |
0000 0001 |
0000 0001 |
-1 |
1000 0001 |
1111 1111 |
正数的原码、反码、补码都是一样的,都为原码
两个0(正负0)的编码都是0000 0000
补码的补码等于原码
算术右移
对于补码做除二运算,称为算法右移,要补的数字就是符号位,如果符号位为0那么就补0。
假如现在有一个十进制数:123。如果让它缩小十倍会变成什么?会变成:12.3。同理,二进制数也是这样的,假如现在有一个二进制数:11001。让这个二进制数缩小2倍会变成什么?会变成:1100.1。即为算术右移
那么因为计算机就给定了一个容器位数,右移的最左位置会跑到那去?答对了就是会被舍去。
比如现在有一个用补码表示的整型变量a,这个a只能储存6位二进制数,假如a为[100111]=-25那么进行一次算术右移即[110011] = -13。
-1和-2^n的表示
(证明一下为什么-2的n次方后面是n个零)
[-1] = 2+(-1) = 10.00...0 + (-1.00...0) = 1.00...0
[-2^n] = 2^(n+1)+2^(n) = 1000...0+(-100...0) = 100...0
以定点整数为例,与原码、反码不同,在补码表示中”0“只有一种形式,且用补码表示负数时范围可到-2^n
移码的表示方法
移码常用于表示浮点数的阶码。
用定点整数形式的移码,把真值平移2^n个单位
定义
[x]移 = 2^n + x (2^n> x >= -2^n)
与[X]补 的区别:符号位相反(这不是移码的一个特点,这只是正好与补码的符号位相反)
移码的优点
可以比较直观地判断两个数据地大小,(浮点数运算时,容易进行对阶操作)
表示浮点数阶码地时候,容易判断是否下溢(当阶码为全0时,浮点数容易下溢)(后面学习讲到)
移码通常用于:比较两数大小,数值比较,对阶操作等
反码
对于反码没有什么好说的,顾名思义,反码就是取反,但是要知道对于正数来说,他的反码就是原码,对于负数来说就是符号位不变,其他按位取反。
原、补、移码的编码形式
正数
原、补码的编码完全相同
补码和移码的符号位相反,数值位相同
负数
原码:符号位为1
数值部分与真值的绝对值相同
补码:符号位为1
数值部分与原码各位相反,且末位加1
移码:符号位与补码相反,数值位与补码相同