我想知道处理器否定一个数字或执行一个减法会更快。例如:
是
int a = -3;
比...更有效率
int a = 0 - 3;
换句话说,一个负数是否等于从0减去?还是有一条特殊的CPU指令可以更快地减去减法?
我想编译器不会优化任何东西。
我想编译器不会优化任何东西。
[如果使用C语言编写,这不是一个很好的假设。由于整数的工作方式,两者对于任何不可怕的编译器都是等效的,并且如果将其编译为更有效的代码,这将是未进行优化的错误。比其他。
如果您实际上想询问有关asm的问题,那么答案取决于ISA。
但是,大多数ISA可以用一条指令取反,通常是从立即数或隐式零或从体系结构零寄存器中减去。
例如32位ARM具有rsb
(反减)指令,该指令可以采用立即数操作数。 rsb rdst, rsrc, #123
的dst = 123-src。立即数为零,这只是个否定。
x86具有neg
指令:neg eax
完全等同于eax = 0-eax,以相同的方式设置标志。
具有零寄存器(硬连线为零)的3操作数体系结构可以像MIPS subu $t0, $zero, $t0
一样完成t0 = 0 - t0
。它不需要特殊的指令,因为$zero
寄存器始终读为零。同样,AArch64删除了RSB,但具有xzr
/wzr
64/32位零寄存器。 (尽管它也有一个伪指令neg
,它从零寄存器中减去)。
您可以通过使用编译器来查看大部分内容。https://godbolt.org/z/B7N8SK但是您实际上必须编译为机器代码并反汇编,因为gcc / clang倾向于在AArch64和RISC-V上使用neg
伪指令。不过,您仍然可以看到ARM32的rsb r0,r0,#0
for int negate(int x){return -x;}