函数 Odd(x) 和 ((x Mod 2) <> 0) 之间有区别吗

Is there a difference between the function Odd(x) and ((x Mod 2) <> 0)

Delphi(实际上是 Pascal)具有函数 Odd(x: integer): boolean which returns true,如果参数不能被 2 整除,false 如果是:

if Odd(x) then
  WriteLn('Argument is odd.')
else
  WriteLn('Argument is even.')

或者可以使用 mod 运算符:

if (x mod 2) <> 0 then
  WriteLn('Argument is odd.')
else
  WriteLn('Argument is even.')

性能上有什么不同吗?我希望编译器为系统函数生成优化代码。

我对有关 Delphi 2007 的答案特别感兴趣,但如果有人也可以检查其他 Delphi 版本,那就太好了。

Odd 使用 test 指令生成最好的代码(检查最低位),其中 1 后跟零跳转。从 Turbo Pascal 开始就是这样。

生成相同代码的另一种方法是

if x and 1 <> 0 then

但是当您可以使用 Odd.

以更简洁的方式编写代码时,您为什么要编写这样的代码?

反正奇数最好;

至于x mod 2检查,性能取决于x是有符号整数还是无符号整数;为无符号类型生成的代码更有效。

Delphi XE编译器:

奇数(x):

Project11.dpr.10: if Odd(x) then
0040F327 F645FC01         test byte ptr [ebp-],
0040F32B 741B             jz [=10=]40f348

x mod 2,无符号 x(长字):

Project11.dpr.14: if (x mod 2) <> 0 then
0040F431 8B45FC           mov eax,[ebp-]
0040F434 83E001           and eax,
0040F437 85C0             test eax,eax
0040F439 741B             jz [=11=]40f456

x mod 2, 有符号 x (longint):

Project11.dpr.14: if (x mod 2) <> 0 then
0040F361 8B45FC           mov eax,[ebp-]
0040F364 2501000080       and eax,000001
0040F369 7905             jns [=12=]40f370
0040F36B 48               dec eax
0040F36C 83C8FE           or eax,-
0040F36F 40               inc eax
0040F370 85C0             test eax,eax
0040F372 741B             jz [=12=]40f38f