整数的表示方式精解
这一届比較重要,不正确,是非常重要.上一次我们说了布尔代数以及C语言的位运算.
C语言中的整数类型以及范围
以C语言为例,C语言其中提供了多种整数类型,一共始终,位数为1,2,4,8,其中32位机器上,4位的有两种,64位的机器上,8位的有两种.以下是32位OS上,这十种整数的范围:
32位的系统不常见了,来看一下64位OS上的范围:
说实话,差点儿相同,你不用背过.
上述是C语言中各个整数类型的表示范围,只是C语言有他的最小数值范围,也就是说C语言要求这些数据类型至少要满足一个标准的范围.下图是C语言对整数类型要求的最小表示范围:
细致看的话,能够发现,C语言仅仅要求有符号数的范围是对称的,另外就是int和long类型的位数要求都比較低,各自是2位和4位.
无符号编码
你可看到以上的表中,每一种整数类型都能够加上unsignedkeyword,来表示一个一个无符号数,即没有正负之分.在书中,给出了无符号数的定义,对于一个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语言同意有符号与无符号之间的相互转换。
在同是w个bit表示的基础上。因为有符号与无符号表示的范围不同,因此它们之间的转换与数值意义上的转换会有不同。
规则是“位不变。值可能变”!
看一个样例。如用3个bit表示的无符号数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)。于是有
相同的由补码表示的有符号数转换成无符号数的关系为
这是我写过最操蛋的博客,没有之中的一个,弄格式的时候我连吃人的心都有了!!!