а = -2147483648 - а; оптимизации компилятора


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

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

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

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

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

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

4 6

4 ответа:

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

Он, по-видимому, преобразуется из дополнения 2 в знаковую величину

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