-x和~x + 1之间的差异

时间:2016-08-29 09:54:57

标签: performance assembly compilation

我知道对于带符号的32位或64位整数-x~x + 1会返回相同的结果。

但我有几个问题:

  1. 编译器是否将它们转换为相同的操作?
  2. 为什么?
  3. 如果它没有,它们是如何翻译的?
  4. 如果没有,那么-x是否有直接的硬件实现?

1 个答案:

答案 0 :(得分:5)

  

编译器是否将它们转换为相同的操作?

这取决于编译器的智能程度以及是否已启用优化。通常,您可以期待一个好的编译器为两者生成相同的代码。

  

为什么?

某些优化工具有规则可以优化~x + 1-x,有些则不然。这种优化通常是peephole optimizer的一部分,您可能需要阅读链接文章以获取详细信息。

  

如果没有,它们是如何翻译的?

这取决于目标平台。例如,在i386上,x注册表中eax-x可能会被翻译为

neg %eax

~x + 1可能会被翻译为

not %eax
inc %eax

在其他平台上,翻译不同。例如,在ARM上,第一个是

rsb r0,r0,#0

,第二个是

mvn r0,r0
add r0,r0,#1
  

如果没有,那么-x是否有直接的硬件实现?

通常有一个否定指令或编译器根据定义简单地将值从0减去为0 - x = - x