代码之家  ›  专栏  ›  技术社区  ›  Andreas Bonini

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

  •  6
  • Andreas Bonini  · 技术社区  · 14 年前

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

    我发现这样的东西好几次了:

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

    我原以为是 abs() :A下溢,这样您得到正值。但自从 a 为负(参见if),相当于:

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

    这将是一个非常小的负数,而不是 完全。我错过了什么?

    4 回复  |  直到 14 年前
        1
  •  7
  •   kennytm    14 年前

    它转换数字,使位31成为符号位,其余位(0…30)表示绝对量值。例如,如果a=-5,则在操作后变为0x800000005。

        2
  •  4
  •   BlueRaja - Danny Pflughoeft    14 年前

    它似乎正在从 2's complement sign-magnitude

        3
  •  0
  •   Mchl    14 年前
        4
  •  0
  •   Jay    14 年前

    我真诚地希望原始资料说的是0x8000000而不是-2147483648!十六进制数至少给了读者一个线索。十进制很神秘。