计算机中数的表示

作者: Imentu | 来源:发表于2017-09-12 19:20 被阅读98次

     上篇讲到在计算机中所有数据都是采用位模式表示的,数字也不例外,但它并不采用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)将整数部分和小数部分组合起来


  

相关文章

网友评论

本文标题:计算机中数的表示

本文链接:https://www.haomeiwen.com/subject/kqthsxtx.html