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

µTh*_*ory -1 performance assembly compilation

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

但我有几个问题:

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

fuz*_*fuz 5

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

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

为什么?

一些优化有一个规则,以优化~x + 1-x,有些则没有.这种优化通常是窥视孔优化器的一部分,您可能需要阅读链接的文章以获取详细信息.

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

这取决于目标平台.例如,在i386上,xeax寄存器中,-x可能会被翻译为

neg %eax
Run Code Online (Sandbox Code Playgroud)

~x + 1可能被翻译成

not %eax
inc %eax
Run Code Online (Sandbox Code Playgroud)

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

rsb r0,r0,#0
Run Code Online (Sandbox Code Playgroud)

第二是

mvn r0,r0
add r0,r0,#1
Run Code Online (Sandbox Code Playgroud)

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

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