32bits系统中foo(2^31-3)的值

题目:int foo(int x){

return  x & -x

}


其中2^31-3=2147483645;二进制为01111 11111 11111 11111 11111 11111 01

                                    取反二进制为10000 00000 00000 00000 00000 00000  11


则结果为 x&-x =1


后来发现这样的解法是错误的,理由是这样的:


其实2^31-3表示的意思是2异或上31后再减去3,值为26(这样算其实是错的,因为负号的优先级高于异或的优先级)

                                                2^31-3其实是2^(31-3)=30

                                        30的二进制为00000 00000 00000 00000 00000 00111 10

                                     取反的二进制为11111 11111 11111 11111 11111 11000 10

                                            ------------------------------------------------------------------------------------------

                                                              00000  00000 00000 00000 00000 00000 10=2


所以正确的结果应该是2才对。

                                       




正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1


比如定义char i = -5;
那么,i存的二进制数是8bit的 1111_1011
如果运行 i=~i;那么结果就是  i=0000_0100

所以取反的结果基本上只跟变量的类型(也就是数据位宽)有关,以及和初值有关,好像跟是否为有符号数也没关。就算定义的是unsigned char i=-5;
i存的8bit的二进制值还是1111_1011



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值