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

C a=-2147483648-a;编译器优化,c,reverse-engineering,compiler-optimization,C,Reverse Engineering,Compiler Optimization,我试图学习如何对软件进行反向工程,以及在编译器优化之前理解代码外观的所有技巧 我多次发现类似的情况: if (a < 0) a = -2147483648 - a; 这将是一个非常小的负数,而不是a的绝对值。我遗漏了什么?可能:?它正在转换数字,使位31成为符号位,其余位(0…30)表示绝对大小。e、 g.如果a=-5,那么在操作后它将变成0x8000005。它似乎正在从转换为我真诚地希望原始来源说的是0x8000000,而不是-2147483648!十六进制数至少给

我试图学习如何对软件进行反向工程,以及在编译器优化之前理解代码外观的所有技巧

我多次发现类似的情况:

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

这将是一个非常小的负数,而不是
a
的绝对值。我遗漏了什么?

可能:?

它正在转换数字,使位31成为符号位,其余位(0…30)表示绝对大小。e、 g.如果a=-5,那么在操作后它将变成0x8000005。

它似乎正在从转换为

我真诚地希望原始来源说的是0x8000000,而不是-2147483648!十六进制数至少给了读者一个线索。小数点非常神秘。

您没有遗漏任何内容。您可以使用abs(a)| 0x8000000代替。不知道为什么这会有用。从--“所以,对计算机来说,取一个数字的负数,也就是从0减去一个数字,就等同于将位反转并加上一,这就是技巧的来源”。换句话说,它是从两个补数到符号大小的转换。(我想知道这在典型的编译器中有什么用处。)@Gilles:它可能是实际的应用程序代码,而不是编译器的优化。我只是认为这是一个优化,因为它看起来像一个。有没有任何建议,为什么反向工程软件会经常这样做,以至于OP特别注意到它?我在想,这可能是从int到IEEE 754浮点表示的软件转换的一部分,但在我看来,在这种情况下,将符号位放在最后总是比较简单的。对于可以用这种方式表示的整数,使用这种格式的数字对于打印出有符号整数或准备在不能执行这些运算的有符号版本的机器上进行乘法或除法非常有用天生的。@Pascal:我不知道。我们需要@Andreas提供更多的上下文。由于它是反编译代码,我无法知道原始源代码是怎么说的。此外,这应该是一个评论。这就是为什么我说“我希望原始源…”我假设如果你正在反编译,你没有原始源。
    if (a < 0)
      a = -2147483648 + abs(a);