a = -2147483648 - a; 编译器优化

Tho*_*ini 6 c reverse-engineering compiler-optimization

我正在尝试学习如何逆向工程软件和所有技巧,以便在编译器优化之前了解代码的样子.

我发现了几次这样的事情:

    if (a < 0)
      a = -2147483648 - a;
Run Code Online (Sandbox Code Playgroud)

我原本以为它是一个abs():下溢,所以你得到正值.但由于a是否定的(见if),这相当于:

    if (a < 0)
      a = -2147483648 + abs(a);
Run Code Online (Sandbox Code Playgroud)

这将是一个非常小的负数,而不是绝对值a.我错过了什么?

ken*_*ytm 7

它正在转换数字,使位31成为符号位,其余位(0 ... 30)表示绝对幅度.例如,如果a = -5,那么在操作之后它变为0x80000005.