-2

我使用的语言是 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。

有谁能够帮助我?谢谢

4

2 回答 2

2

0 + 11,这意味着运算符优先级与您认为的不同。

gcc 足够聪明,可以为此发出警告:

警告:在 '&' 的操作数中建议在 '+' 周围加上括号</p>

(!sign) & (!(!(0x80000000&(y+(~x+1)))))+(sign&(!sign_x)));

添加额外的括号:

((!sign)&(!(!(0x80000000&(y+(~x+1)))))) + ((sign&(!sign_x))));

或者,由于表达式相当复杂,暂时存储部分结果:

int part1 = ...
int part2 = ...
return part1 + part2;
于 2012-06-03T08:54:29.640 回答
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 。

请参阅 sum 的第一部分周围的括号:

(!sign)&(!(!(0x80000000&(y+(~x+1))))) ----> ((!sign)&(!(!(0x80000000&(y+(~x+1))))))
于 2012-06-03T08:55:34.607 回答