2010-08-12 142 views
8

我需要组合两个32位值来创建一个64位值。我正在寻找类似于MAKEWORDMAKELONG的东西。我可以很容易地定义自己的宏或函数,但是如果API已经提供了它,我宁愿使用它。是否有MAKELONGLONG功能?

+0

通过 “合并,” 你的意思是 “添加” 或 “正片叠底”? – mcandre 2010-08-12 20:03:16

+2

@mcandre:他是指MAKEWORD的意思。 – 2010-08-12 20:08:36

+0

Andreas是对的,@Mcandre。就像我说的,“和MAKEWORD和MAKELONG类似。” – 2010-08-12 20:19:14

回答

2

我在Windows API中找不到任何东西。但是,我知道,你基本能工作(或者,至少,很多)与德尔福,所以这里是一个快速的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中。现在,一个64位的结果存储在EAX(低有效位,低地址)和EDX(更高有效位,高地址)中;因此我们需要将A移动到EAX和B EDX,但他们已经在那里!

+1

感谢您考虑我的背景,但事实证明,我现在正在使用C和C++。你的技巧很聪明。我会命名变量'H'和'L',这样Code Completion会提醒我他们进入了什么顺序。我的Delphi实现可以和C实现相媲美:'Result:=(UInt64(H)shl 32)或L'。 – 2010-08-13 13:47:46

+0

我本来希望得到的答案比“我看不到一个”更确切一点,但是我可能把我的视线设置的太高,所以这个答案得到了奖励。谢谢。 – 2010-08-18 17:59:44

0

个人而言,我更喜欢C-宏

#define MAKE_i64(hi, lo) ( (LONGLONG(DWORD(hi) & 0xffffffff) << 32) | LONGLONG(DWORD(lo) & 0xffffffff) ) 
+0

我更喜欢功能,但这不是个人喜好的问题。这是API中存在的问题。你的答案是否?此外,位掩码在您的宏中没有任何贡献。 – 2014-01-09 15:59:38