在 C# 中,可以使用减号
int
将正值 -
变为负值,如下所示:
var positiveInt = 5;
var negativeInt = -positiveInt;
执行此操作时,幕后是否会发生额外的操作(即 CPU 实际上是否将数字乘以
-1
)?
您可以使用 SharpLab 或 Godbolt Compiler Explorer 来查看 .NET JIT 编译器为各种代码片段发出的内容。特别是,比较以下两种方法具有指导意义:
static int M1()
{
var positiveInt = 5;
var negativeInt = -positiveInt;
return negativeInt;
}
static int M2(int positiveInt)
{
var negativeInt = -positiveInt;
return negativeInt;
}
对于
M1
,JIT 编译器执行常量传播并发出仅返回 0xfffffffb
的代码,表示常量 -5
:
mov eax, 0xfffffffb
ret
但是对于
M2
,寄存器 positiveInt
中的 ecx
参数是一个未知值,JIT 编译器会发出一个 neg
指令(对于 x86)来否定该值:
mov eax, ecx
neg eax
ret