题目: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

被折叠的 条评论
为什么被折叠?



