我知道对于带符号的32位或64位整数-x
和~x + 1
会返回相同的结果。
但我有几个问题:
-x
是否有直接的硬件实现?答案 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 。