我正在尝试学习如何对软件进行逆向工程以及在编译器优化之前了解代码外观的所有技巧。
我多次发现这样的事情:
if (a < 0)
a = -2147483648 - a;
我最初认为这是一个abs()
:a 下溢,所以你得到了正值。但由于a
是负数(见 if),这相当于:
if (a < 0)
a = -2147483648 + abs(a);
这将是一个非常小的负数,而不是绝对值a
。我错过了什么?
我正在尝试学习如何对软件进行逆向工程以及在编译器优化之前了解代码外观的所有技巧。
我多次发现这样的事情:
if (a < 0)
a = -2147483648 - a;
我最初认为这是一个abs()
:a 下溢,所以你得到了正值。但由于a
是负数(见 if),这相当于:
if (a < 0)
a = -2147483648 + abs(a);
这将是一个非常小的负数,而不是绝对值a
。我错过了什么?
它正在转换数字,以便第 31 位成为符号位,其余位 (0...30) 表示绝对幅度。例如,如果a = -5,则在操作后它变为0x80000005。
也许:http ://en.wikipedia.org/wiki/Two%27s_complement ?
我真诚地希望原始来源说 0x80000000 而不是 -2147483648 !十六进制数字至少给了读者一个线索。十进制非常神秘。