【发布时间】:2011-03-30 15:21:36
【问题描述】:
我正在尝试学习如何对软件进行逆向工程以及了解编译器优化之前代码外观的所有技巧。
我多次发现这样的事情:
if (a < 0)
a = -2147483648 - a;
我原本以为是abs(): 下溢所以你得到了正值。但是由于a 是负数(见if),这相当于:
if (a < 0)
a = -2147483648 + abs(a);
这将是一个非常小的负数,而不是a 的绝对值。我错过了什么?
【问题讨论】:
-
你没有错过任何东西。你可以使用 abs(a) | 0x80000000 代替。不知道为什么会有用。
-
From cs.cornell.edu/~tomf/notes/cps104/twoscomp.html -- "所以,对计算机来说,取一个数的负数,也就是从0中减去一个数,相当于取反加一,也就是诀窍从何而来”。
标签: c reverse-engineering compiler-optimization