2012-06-03 35 views
-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。

任何人都可以幫助我嗎?謝謝

+11

**什麼語言**? – Mat

+0

老兄,你被問及關於[上一次]的語言(http://stackoverflow.com/questions/10862523/questions-about-operator)。答案取決於你使用的編程語言,所以你需要告訴它。 – JJJ

+0

對不起,我用C – shirley

回答

2

0 + 1 1,這意味着運算符優先級與您認爲的不同。

GCC是聰明地發出了這樣的警告:

警告:在 '&'

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

操作建議圍繞 '+' 括號內添加額外的括號:

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

或者,由於表達式相當合適mplex,臨時存儲結果的部分:

int part1 = ... 
int part2 = ... 
return part1 + part2; 
+0

做算子「&」比算子「+」有更高的優先級嗎? – shirley

+0

@Shirley:不,這些信息可以在任何體面的C文獻中找到。例如,[Here](http://isthe.com/chongo/tech/comp/c/c-precedence.html)。 – Clifford

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