c语言:c=unsigned(c)> > (sizeof(int)*8-1);

□﹎夢寐〞  2011-10-11 

c语言:c=unsigned(c)> > (sizeof(int)*8-1);??

 
  150

int   c=a-b; 
char   *strs[2]={ "a大 ", "b大 "}; 
c=unsigned(c)> > (sizeof(int)*8-1);

问题一:我看不懂这句话到底是什么意思,c=unsigned(c)> > (sizeof(int)*8-1);?? 
有人说:
如果c是正,最大不超过2   31   -1,所以把c转化为unsigned后,因为unsigned   0---2   32-1 
所以最高位(32)为0,所以右移31位后最高位就已经在最低位,所以c为0.

问题二:“最高位(32)为0,所以右移31位后最高位就已经在最低位,所以c为0"这句话什么意思???

满意答案

热心问友 2011-10-11

其实这是一个高级的比较大小函数。就是利用位运算,不利用if,switch,?等判断语句。
sum=a+b;
b=a- b;
a+=b*(b>>(sizeof(int)*8-1);
return  sum-a;
函数没有unsign是正确的。
b=a-b;
a>b时
(b>>(sizeof(int)*8-1)的值
为0。
a=a+0=a;
此时sum-a=b;
也就是返回较小值b。
a<b时
(b>>(sizeof(int)*8-1)的值
为-1。
a=a-b=a-(a-b)=b;
此时sum-a返回较大者a
补充:
上面回答的是昨天的。位运算你上百度看看。我用手机打很麻烦。
追问:

这个(sizeof(int)*8-1)代表B右移动几位???

回答:
在VC6.0就是移31位了。你可以自己上机。不知道你学过位运算没有。我这里讲不出大概。你看过后就明白了。
追问:
31吗?我就是不太懂位运算啊,b>0时(b>>(sizeof(int)*8-1)的值为什么是0?
追问:
哎,真麻烦,谢谢你哦,我怎么老不懂,你是怎么学的呢?
回答:
比如b=3。二进制形式就是000....00011一共32位。向右移31位就是除第一个0外后面31位全部舍去就剩下一个0了,再在这个0的前面补上31个0最后二进制为00000....00共32个。因此结果为0。
如b=-3,二进制就是111111.......1101负数在计算机上是以补码存储。向右移31位就余下1,负数最高位补1其余补 0。最后二进制形式就是100000.........001值为-1。
上面那个题为c强制转换无符号整型负数和正数一样前面就都是补0了。
手机就只能这样讲了
追问:
你真好哦,(*^__^*) 嘻嘻……这回真懂了,我只剩150分了,所以只能给你这些了,谢谢你用手机还帮我解释这个,非常感谢。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值