2010-08-12 13 views
8

Necesito combinar dos valores de 32 bits para crear un valor de 64 bits. Estoy buscando algo análogo a MAKEWORD y MAKELONG. Puedo definir fácilmente mi propia macro o función, pero si la API ya proporciona una, preferiría usar eso.¿Hay una función MAKELONGLONG?

+0

Por "Combinar" Qué quiere decir "añadir" o "multiplicar"? – mcandre

+2

@mcandre: Quiere decir en el sentido de MAKEWORD. –

+0

Andreas tiene razón, @Mcandre. Como dije, "análoga a MAKEWORD y MAKELONG". –

Respuesta

2

No puedo encontrar ninguno en la API de Windows. Sin embargo, sé que usted trabaja en su mayoría (o, al menos, mucho) con Delphi, asi que aquí hay una función rápida Delphi:

function MAKELONGLONG(A, B: cardinal): UInt64; inline; 
begin 
    PCardinal(@result)^ := A; 
    PCardinal(cardinal(@result) + sizeof(cardinal))^ := B; 
end; 

Aún más rápido:

function MAKELONGLONG(A, B: cardinal): UInt64; 
asm 
end; 

Explicación: En el normal register convención de llamadas, los primeros dos argumentos (si tamaño cardinal) se almacenan en EAX y EDX, respetivamente. Un resultado (de tamaño cardinal) se almacena en EAX. Ahora, un resultado de 64 bits se almacena en EAX (bits menos significativos, dirección baja) y EDX (bits más significativos, dirección alta); por lo tanto, tenemos que mover A a EAX y B a EDX, ¡pero ya están allí!

+1

Gracias por considerar mis antecedentes, pero resulta que ahora estoy trabajando en C y C++. Tu truco de astm es inteligente. Yo nombraría las variables 'H' y' L' para que Code Completion me recordara en qué orden van. Mi implementación Delphi habría sido comparable a una implementación C: 'Result: = (UInt64 (H) shl 32) o L'. –

+0

Tenía la esperanza de obtener una respuesta un poco más definitiva que "No veo ninguna", pero probablemente me puse demasiado alta, por lo que esta respuesta recibe el premio. Gracias. –

0

personalmente prefiero C-macros

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

Prefiero funciones, pero esta no era una cuestión de preferencias personales. Era una cuestión de existencia en la API. ¿Tu respuesta es * no *? Además, las máscaras de bits no aportan nada en tu macro. –

Cuestiones relacionadas