Есть ли функция MAKELONGLONG?

136
22

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

спросил(а) 2021-01-19T18:37:31+03:00 6 месяцев, 1 неделя назад
1
Решение
78

Я не могу найти ни одного в 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, но они уже есть!

ответил(а) 2021-01-19T18:37:31+03:00 6 месяцев, 1 неделя назад
45

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

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

ответил(а) 2021-01-19T18:37:31+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема