a = -2147483648 - a;оптимизация компилятора - PullRequest
6 голосов
/ 17 августа 2010

Я пытаюсь узнать, как перепроектировать программное обеспечение и все хитрости, чтобы понять, как выглядит код до оптимизации компилятора.

Я обнаружил что-то подобное несколько раз:

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

Первоначально я думал, что это abs(): недостаток, так что вы получите положительное значение.Но поскольку a является отрицательным (см. If), это эквивалентно:

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

Это будет очень маленькое отрицательное число, а не абсолютное значение a вообще.Чего мне не хватает?

Ответы [ 4 ]

7 голосов
/ 17 августа 2010

Он преобразует число так, что бит 31 становится знаковым битом, а остальные биты (0 ... 30) обозначают абсолютную величину.например, если a = -5, то после операции оно становится 0x80000005.

4 голосов
/ 17 августа 2010

Похоже, что он преобразуется из 2 дополнения в знак

0 голосов
/ 17 августа 2010

Я искренне надеюсь, что в оригинальном источнике было указано 0x80000000, а не -2147483648!Шестнадцатеричное число, по крайней мере, дает читателю подсказку.Десятичная дробь очень загадочная.

0 голосов
/ 17 августа 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...