-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 で、2 番目の部分が 1 であるため、なぜ結果が 1 ではなく 0 になるのか疑問に思います。演算子「+」から「|」、結果は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 に答える