а = -2147483648 - а; оптимизации компилятора
Я пытаюсь научиться реинжинирингу программного обеспечения и всем хитростям, чтобы понять, как выглядит код до оптимизации компилятора.
Я несколько раз находил нечто подобное:
if (a < 0)
a = -2147483648 - a;
Я изначально думал, что это abs()
: A недовыполняется, поэтому вы получаете положительное значение. Но поскольку a
отрицательно (см. if), это эквивалентно:
if (a < 0)
a = -2147483648 + abs(a);
, которое будет очень малым отрицательным числом, а вовсе не абсолютным значением a
. Что я пропал?
4 ответа:
Он преобразует число так, что бит 31 становится битом знака, а остальные биты (0...30) обозначает абсолютную величину. например, если a = -5, то после операции он становится 0x80000005.
Он, по-видимому, преобразуется из дополнения 2 в знаковую величину
Возможно: http://en.wikipedia.org/wiki/Two%27s_complement ?