关于运算符“+”的问题

时间:2012-06-03 08:24:57

标签: c operators

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

任何人都可以帮助我吗?感谢

2 个答案:

答案 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))))))