C中的整型(1)

 

。整型的位级表示

 

  一个w位的无符号整型位向量所表示的值是:

 

                    (1)

 

Xi为位向量第i位bit值。

 

w位有符号二进制补码表示的位向量所表示的值是:

 

        (2)

 

等同于:

 

            (3)

 

其中w-1位为符号位

 

我们假设w为8,长度为8的位向量所能表示的数字是2^8个,对于无符号数,值从0到+255,对于有符号数,值从-128到+127。当整数的值为0~127时,无符号和有有符号二进制补码有相同的位级表示。位模式1000 0000~1111 1111表示的无符号整数值为128~255,有符号值为-128~-1,反过来说,无符号整数值128~255与有符号整数值-128~-1有相同的位模式。当程序中进行有符号与无符号整型数据的强制转换时,并不改变位模式,只是改变了对位模式的解释规则。所以,当整数的位模式属于集合{1000 0000……1111 1111}的时候,无符号整型与有符号整型之间的强制转换得不到直觉所预期的结果^_^。还可以发现,当位模式属于集合{1000 0000……1111 1111}的时候,它所表示的无符号整数值与有符号整数值相差256 == 2^w。

 

。有符号数正负之间的转换

我们可以把有符号数-x与x(x为w位有符号数可表示范围内正数)的位模式解释成无符号整数,可以看到,x的无符号值为x,-x的无符号值为2^w-x,它们的和为x+2^w-x =2^w。那么,x == (signed)((unsigned)2^w-(unsigned)(-x)),-x==(signed)((unsigned)2^w-(unsigned)x)。注意,有一个特殊值-2^(w-1),它转换为正数会溢出,因为w位有符号整数表达的最大数字是2^(w-1)-1。

按照CSAPP这本书上的方法,正负之间的转换可以把位模式进行取反然后加上1。比如 x == ~(-x)+ 1。原因是可以把对任何w位的二进制位模式取反看成形式为w个1的位向量(2^w-1)减去这个二进制位模式,那么就有 ~(-x)+ 1 == (signed)((unsigned)(2^w - 1) -(unsigned)(-x)+(unsigned) 1 )== (signed)((unsigned)2^w-(unsigned)(-x)) ==  x。用~(x -1)也可以达到同样的效果。其实~(-x-1)也就相当于~(-x) + 1。因为~(-x-1)== 2^w-1-(-x-1) == 2^w -1 -(- x) +1 == 2^w-(-x) == x。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值