我需要组合两个32位值来创build一个64位的值。 我正在寻找类似MAKEWORD
和MAKELONG
。 我可以很容易地定义我自己的macros或函数,但如果API已经提供了,我宁愿使用它。
我无法在Windows API中找到任何内容。 然而,我知道你使用Delphi大部分(或者至少是很多)工作,所以这是一个快速的Delphi函数:
function MAKELONGLONG(A, B: cardinal): UInt64; inline; begin PCardinal(@result)^ := A; PCardinal(cardinal(@result) + sizeof(cardinal))^ := B; end;
甚至更快:
function MAKELONGLONG(A, B: cardinal): UInt64; asm end;
说明:在正常的register
调用约定中,前两个参数(如果是基本大小的)分别存储在EAX和EDX中。 一个(基数大小)的结果存储在EAX中。 现在,EAX(低有效位,低地址)和EDX(更高有效位,高地址)存储了64位结果。 因此我们需要把A
移到EAX和B
到EDX,但是它们已经在那里了!
我个人更喜欢C宏
#define MAKE_i64(hi, lo) ( (LONGLONG(DWORD(hi) & 0xffffffff) << 32 ) | LONGLONG(DWORD(lo) & 0xffffffff) )