6

ソフトウェアをリバース エンジニアリングする方法と、コンパイラの最適化前のコードがどのように見えるかを理解するためのすべてのトリックを学ぼうとしています。

私はこのようなものを数回見つけました:

    if (a < 0)
      a = -2147483648 - a;

私はもともとそれがabs()アンダーフローだと思っていたので、正の値が得られます。しかし、aは負であるため (if を参照)、これは次と同等です。

    if (a < 0)
      a = -2147483648 + abs(a);

これは非常に小さな負の数であり、絶対値ではありませんa。私は何が欠けていますか?

4

4 に答える 4

7

ビット 31 が符号ビットになり、残りのビット (0...30) が絶対値を表すように数値を変換しています。たとえば、a = -5 の場合、操作後は 0x80000005 になります。

于 2010-08-16T20:06:53.273 に答える
4

2 の補数から符号の大きさに変換しているようです

于 2010-08-16T20:18:49.417 に答える
0

元のソースが -2147483648 ではなく 0x80000000 であることを心から願っています! 16 進数は、少なくとも読者に手がかりを与えます。小数は非常に不可解です。

于 2010-08-16T21:12:44.340 に答える
0

たぶん: http://en.wikipedia.org/wiki/Two%27s_complement ?

于 2010-08-16T20:06:53.020 に答える