Есть ли функция MAKELONGLONG? - PullRequest
9 голосов
/ 12 августа 2010

Мне нужно объединить два 32-битных значения для создания 64-битного значения. Я ищу что-то аналогичное MAKEWORD и MAKELONG. Я легко могу определить свой собственный макрос или функцию, но если API уже предоставляет их, я бы предпочел использовать это.

Ответы [ 2 ]

3 голосов
/ 13 августа 2010

Я не могу найти ничего в 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.Теперь 64-битный результат сохраняется в EAX (младшие разряды, низкий адрес) и EDX (старшие разряды, старший адрес);следовательно, нам нужно переместить A в EAX и B в EDX, но они уже есть!

0 голосов
/ 09 января 2014

Лично я предпочитаю C-макросы

#define MAKE_i64(hi, lo)    (  (LONGLONG(DWORD(hi) & 0xffffffff) << 32 ) | LONGLONG(DWORD(lo) & 0xffffffff)  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...