我使用的语言是C。
我的代码如下:
int sign_x=~(x>>31)+1;
int sign_y=~(y>>31)+1;
int sign=sign_x^sign_y;
return ((!sign)&(!(!(0x80000000&(y+(~x+1)))))+(sign&(!sign_x)));
当我设置输入x = 2147483647 [0x7fffffff],y = -2147483648 [0x80000000]时,结果为0。 我想知道为什么结果是0而不是1,因为第一部分是0而第二部分是1.当我将运算符“+”改为“|”时,结果是OK。
任何人都可以帮助我吗?感谢
答案 0 :(得分:2)
0 + 1 1,这意味着运算符优先级与您的想法不同。
gcc非常聪明,可以发出警告:
警告:建议在'&'
的操作数中围绕'+'括起来
(!sign) & (!(!(0x80000000&(y+(~x+1)))))+(sign&(!sign_x)));
添加额外的括号:
((!sign)&(!(!(0x80000000&(y+(~x+1)))))) + ((sign&(!sign_x))));
或者,因为表达式非常复杂,所以暂时存储部分结果:
int part1 = ...
int part2 = ...
return part1 + part2;
答案 1 :(得分:2)
您需要添加括号的运算符优先级:
int funcTest(int x, int y) {
int sign_x=~(x>>31)+1;
int sign_y=~(y>>31)+1;
int sign=sign_x^sign_y;
return (
((!sign)&(!(!(0x80000000&(y+(~x+1)))))) + (sign&(!sign_x))
);
返回1.
查看总和的第一部分周围的括号:
(!sign)&(!(!(0x80000000&(y+(~x+1))))) ----> ((!sign)&(!(!(0x80000000&(y+(~x+1))))))