上篇讲到在计算机中所有数据都是采用位模式表示的,数字也不例外,但它并不采用ASCII码表示。因为这种形式表示数字效率不高,ASCII码可以表示128个字符,也意味着每个字符需要8个位,但十进制却只需要十个字符,这是一种极大的资源浪费。例如,如果想用ASCII码存储65535,那么就需要五个字节,而使用无符号整数表示却只需要2个字节。
十进制和二进制
当今的计算机系统中有两种数制占主导地位:十进制和二进制。
我们都十分容易理解十进制系统,这主要是由于我们日常频繁的使用,从而成为了一种基本本能,但是有谁真正理解为什么第二位上表示的十位,第三位上表示的是百位呢?答案在于该技术系统的底数幂,在十进制中该书为10。因此,第一位为10^0(1),第二位为10^1(10),第三位为10^2(100)。
例如: 243=2*10^2+4*10^1+3*10^0
也即: 243=2*100+4*10+3*1
相应的,二进制系统底数为2。在二进制系统中只有两个数字,0和1。
整数的表示法
整数,即完整的数(没有小数部分)。整数可以是正的或负的。负整数的范围是从负无穷到0,正整数是从0到正无穷,但实际上没有计算机可以存储上面所述范围的所有整数。因为要做到这点需要有无限的位,这就意味着计算机要有无限的存储能力。
为了高效的利用计算机的存储空间,人们设计了两种整数的表示法:无符号整数和有符号整数,而有符号整数还有三种不同的表示方法(符号加绝对值格式、二进制反码格式、二进制补码格式);
无符号整数格式
无符号整数就是没有符号的整数,他的范围介于0到正无穷之间。然而,由于计算机不可能表示这个范围的所有整数,通常,计算机都定义了一个最大无符号整数的常量。这样,无符号整数的范围就介于0到该常量之间。
表示法:
1)首先将整数变成二进制数
2)如果二进制位数不足N位,则在二进制数的左边补0,使它的总位数为N位
译解:
如同常规将二进制数转换为十进制数
溢出:
如果所存储的整数超过该单位所能存储的最大值,将会产生溢出。
应用:
计数时,不需要负数。
有符号整数格式
符号加绝对值格式
用符号加绝对值格式存储整数,需要用一个二进制位表示符号(0表示正,1表示负)。这就意味着在8位存储单元中,只有7位可以用来表示数的绝对值。因此,最大正数值仅是无符号整数最大数的一半。
表示法:
1)首先将整数变成二进制数。
2)如果二进制位数不足N-1位,则在二进制数的左边补0,使它的总位数为N-1位
3)如果是正数,则在左边加0(使他变成N位)。如果是负数,则在左边加1(使它变成N位)
译解:
1)忽略第一位(最左边的位)
2)如同常规将剩余N-1位二进制数转换为十进制数
应用:
现在,计算机中并没有采用这种方式存储带符号的数。主要考虑到以下两个原因:
第一,采用这样的表示法进行加、减运算不方便。
第二,0在这种表示法由两种表示形式。
二进制反码格式
二进制反码表示法中采用了另一个不同的约定:表示正数,约定使用无符号整数,表示负数,则用正数的反码形式。
在这个系统中0也有两种表示形式:+0和-0(00000000,11111111)
表示法:
1)首先将整数转换成二进制数,符号被忽略
2)在数的左边补0,使它的总位数为N位
3)如果符号为正,则不做变动。如果符号为负,则每一位换成它的反码形式(把0变成1,把1变成0)
译解:
1)如果最左边的位为0(整数)
①把整个二进制数转换为十进制数
②在数前面加正号(+)
2)如果最左边的位是1(负数)
①把整个二进制数转换成它的反码形式
②再把转换过的二进制数转换成十进制数
③在数前面加负号(-)
应用:
现在,计算机中并没有采用这种方式存储带符号的数。主要考虑到以下两个原因:
第一,采用这样的表示法进行加、减运算不方便。
第二,0在这种表示法由两种表示形式。
二进制补码格式
正如前面提到的,二进制反码表示法有两个0.这在计算中会造成一些混乱。二进制补码表示法解决了上述所有问题。
表示法:
1)首先将数转换成二进制,符号被忽略。
2)如果二进制位数不足N位,在数的左边补0,直到总位数为N
3)如果符号为正,就不需要再做变动。如果符号为负,则将最右边的所有0和首次出现的1不变,其余位取反。
译解:
1)如果最左边的位是0(正数)
①把整个二进制数转成十进制数
②在数前面加正号
2)如果最左边的位是1(负数)
①最右边和首次出现的1不变,其余位取反
②把转换后的二进制数转成十进制数
③在数前面加负号
应用:
是当前计算机用于存储整数的标准表示法,便于运算。
小数的表示法
Excess系统
在计算机中,另一种表示法也可以同时存储正数和负数,这种表示法就叫做Excess系统。在这个系统中,数很容易从十进制转成二进制,反之亦然。但是在运算方面很复杂。现在对它仅有的应用,就是用来存储小数的指数值。
在Excess转换中,正数被称为幻数用于数据转换的过程。幻数通常是(2^N)或(2^N-1)。这里N是存储单元的位数。例如,如果N是8,幻数就是128或127,对于前者我们称为Excess_128表示,后者称为Excess_127表示。
表示法:
1)将整数与幻数相加
2)将结果转换成二进制数,并补0使它的总位数为N位
译解:
1)将二进制转换成十进制
2)从该整数中减去幻数
浮点表示法
把浮点数转换成二进制数,步骤如下:
1)把整数部分转换成二进制数。
2)把小数部分转换成二进制。
为把小数转换成二进制数,可以用复乘的方法。例如,将0.125转换成二进制数字,将该数乘以二,得0.250.将结果的整数部分(0)提取出来,作为二进制数最左边的数字。接下来继续用2乘0.25得到0.50.同样的将结果的整数部分提取出来作为二进制数字的下一位。如此反复直到小数部分变成0或者达到你所能用到的位数。
3)在两部分之间加上小数点。
规范化:
为了表示数71.325(+1000111.0101),将符号、所有的位以及小数点的位置存储于内存中。这种方法虽然具有可行性,但使得对数的运算变得困难。为此需要一个浮点数标准的表示法。解决的办法我们把它称为规范化,即移动小数点使得小数点左边只有一个1。
为了表示这个数的原始值,将他乘以2^e,这里e表示这个数小数点所移动的位数:e为正数则左移,e为负数则右移。根据该数的正负将正负号加在最前面。
符号、幂和尾数:
在一个数规范化后,我们只存储了这个数的三部分信息:符号、指数和尾数(小数点右边的位)。例如,+1000111.0101规范化后成为:
+2^6*1.0001110101 ———— 符号:+ 指数:6 尾数 :0001110101
注意小数点左边的1并没有存储,这种省略是可以理解的。
1.符号
数的符号可以用一个二进制位来存储(0、1)
2.指数
指数(2的幂)定义小数点移动的位数。注意幂可以为正也可以为负。Excess表示法是用来存储指数的方法。所分配的尾数定义了计算机可以存储的数的范围。
3.尾数
尾数是指小数点右边的二进制数。它定义了数的精度。尾数是作为无符号整数存储的。
IEEE标准:
单精度浮点型:
双精度浮点型(64位):
符号(1位),指数(11位),尾数(52位)。
单精度浮点型表示法:
1)存储符号,以0表示负数,1表示正数
2)以Excess——127格式存储指数(2次幂)
3)以无符号整数存储尾数
译解:
1)用最左边的一位表示符号
2)用接下来的8位转换成十进制减去127,结果作为指数
3)用接下来的23位前加个1和小数点,可以忽略右边所有多余的0
4)根据指数的值将小数点移动到正确位置
5)将整数部分转化成十进制数
6)将小数部分转化成十进制数
7)将整数部分和小数部分组合起来
网友评论