整数的表示方式精解

来源:互联网 发布:安利(网络用语) 编辑:程序博客网 时间:2024/04/29 07:32

整数的表示方式精解

这一届比较重要,不对,是很重要.上一次我们说了布尔代数以及C语言的位运算.

 

C语言中的整数类型以及范围

C语言为例,C语言当中提供了多种整数类型,一共始终,位数为1,2,4,8,其中32位机器上,4位的有两种,64位的机器上,8位的有两种.下面是32OS,这十种整数的范围:

 

 

32位的系统不常见了,来看一下64OS上的范围:

 

 

说实话,差不多,你不用背过.

上述是C语言中各个整数类型的表示范围,不过C语言有他的最小数值范围,也就是说C语言要求这些数据类型至少要满足一个标准的范围.下图是C语言对整数类型要求的最小表示范围:

 

仔细看的话,可以发现,C语言只要求有符号数的范围是对称的,另外就是intlong类型的位数要求都比较低,分别是2位和4.

 

 

 

 

 

无符号编码

 

你可看到以上的表中,每一种整数类型都可以加上unsigned关键字,来表示一个一个无符号数,即没有正负之分.在书中,给出了无符号数的定义,对于一个W位的二进制来说,它的无符号表示为以下形式:

 

 

对于一个无符号编码来说,他的最大值和最小值很好确定,对于一个W位的二进制序列来说,当所有位都为0,则为最小值,:

UMinw = 0

当所有位都为1,则为最大值,根据等比数列的求和公式,:UMaxw = 1 * (1-2w) / 1 - 2 = 2w - 1 

 

如果把上述的定义看成是一个函数的话,那么这个函数就是一个双射.就是所,对于任意整数x,0 =< x < 2w的时候,存在唯一的二进制序列与其对应.反过来也是一样的,对于任意一个W位的二进制序列,都存在唯一一个整数x满足0 =< x < 2w,与这个二进制序列对应.

无符号编码属于相对比较简单的格式,因为它符合我们的惯性思维,上述定义其实就是对二进制转换为十进制的公式而已,只不过在一向严格的数学领域来说,是要给予明确的含义的

 

 

 

补码编码

无符号编码符合人们的惯性思维是没错,但是可惜的是,无法表示负整数.因此我们需要一种能够表示负数的整数表示方式,这就是补码编码.与无符号编码一样,书上有定义,即对于任意一个W位的二进制来说,它的补码表示为以下形式:

 

 

这里最高位xw-1为符号位,当它为1,该公式得到的值为负数,当为0,得到的则为正数.

我们观察这个公式,不难看出,补码格式下,对于一个W位的二进制的序列来说,当最高位为1,其余位全为0,得到的就是补码格式的最小值,:

TMinw = -2w-1 

当最高位为0,,其余位全为1,得到的就是补码格式的最大值,根据等比数列的求和公式,:

TMaxw = 1 * (1 - 2w-1) / 1 - 2 = 2w-1-1

与无符号编码一样,如果把上述的定义看成是一个函数的话,那么这个函数同样是一个双射.就是说,对于任意整数x,-2w-1 =< x < 2w-1的时候,存在唯一的二进制序列与其对应.反过来,对于任意一个W位的二进制序列,都存在唯一一个整数x满足-2w-1 =< x < 2w-1 ,与这个二进制序列对应.

党对于无符号的编码来说,补码编码与我们的惯性思维有些不同,因此直观的理解起来会有些别扭,谁让我们干这一行呢,干一行爱一行.

 

 

 

 

 

两种编码的转换

C语言中,我们经常使用强制类型转换,之前我也说过强制类型转换.强制类型转换不会改变二进制序列,但是会改变数据类型的大小以及解释方式,那么考虑相同类型的无符号编码和补码编码,数据类型的大小是没有任何变化,变化的就是他们的解释方式.比如1000这个二进制序列,如果永无符号编码解释的话就表示8,而采用补码编码解释的话,则表示-8.

 

C语言允许有符号与无符号之间的相互转换。在同是wbit表示的基础上,由于有符号与无符号表示的范围不同,因此它们之间的转换与数值意义上的转换会有不同。规则是位不变,值可能变

看一个例子,如用3bit表示的无符号数5,其编码为101,转换成补码表示的有符号数的结果为-3。让我们看看-3的补码表示,正是101。意即转换的时候位串是不变的,还是一样的位串,只不过解释方式不同,原先是用于解释为无符号编码,现在用于解释为补码编码。下面我们看看具体的转换方式是怎样的。

首先定义函数U2Tw(x),它把一个无符号数x映射成一个补码表示的有符号数。如上面的例子有U2T3(5)=-3。来看看这个函数的映射关系到底是怎样的。由于转换的时候位是不变的,因此我们首先把x转成它的无符号编码表示的2进制位串x=U2Bw(x),其中U2Bw(x)B2Uw的反函数,作用是把x映射成它的无符号编码串。接下来用B2Tw(x)就得到了结果,即

 

。可见,转换的结果取决于最高有效位是0还是1,也即x是小于2w-1(0)还是不小于2w-1(1)。于是有

 

同样的由补码表示的有符号数转换成无符号数的关系为

 

 



这是我写过最操蛋的博客,没有之一,弄格式的时候我连吃人的心都有了!!!

0 0