Pregunta

¿Hay alguna forma eficiente de hacer esto?

¿Fue útil?

Solución

Eso es algo para lo que podrías estar usando una unión:

union {
    UINT64 ui64;
    struct {
        DWORD d0;
        DWORD d1;
    } y;
} un;

un.ui64 = 27;
// Use un.y.d0 and un.y.d1

Un ejemplo (en Linix, usando diferentes tipos):

#include <stdio.h>
union {
    long ui64;
    struct {
        int d0;
        int d1;
    } y;
} un;
int main (void) {
    un.ui64 = 27;
    printf ("%d %d\n", un.y.d0, un.y.d1);
    return 0;
}

Esto produce:

27 0

Otros consejos

Pensé en proporcionar un ejemplo usando LARGE_INTEGER PARA la plataforma de Windows. Si tengo una variable llamada " value " eso es de 64 bits, entonces hago:

LARGE_INTEGER li;
li.QuadPart = value;
DWORD low = li.LowPart;
DWORD high = li.HighPart;

Sí, esto lo copia, pero me gusta su legibilidad.

Tenga en cuenta que los enteros de 64 bits tienen restricciones de alineación al menos tan grandes como los enteros de 32 bits en todas las plataformas. Por lo tanto, es perfectamente seguro lanzar un puntero a un entero de 64 bits como puntero a un bit de 32 bits.

ULONGLONG largeInt;
printf( "%u %u\n", ((DWORD *)&largeInt)[ 0 ], ((DWORD *)&largeInt)[ 1 ] );

Obviamente, la solución de Pax es mucho más limpia, pero esto es técnicamente más eficiente ya que no requiere ninguna copia de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top