□﹎夢寐〞
2011-10-11
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分了,所以只能给你这些了,谢谢你用手机还帮我解释这个,非常感谢。。。