Domanda

Esiste un modo efficace per farlo?

È stato utile?

Soluzione

È qualcosa per cui potresti usare un sindacato:

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

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

Un esempio (sotto Linix quindi usando tipi diversi):

#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;
}

Questo produce:

27 0

Altri suggerimenti

Ho pensato di fornire un esempio usando LARGE_INTEGER PER la piattaforma Windows. Se ho una variabile chiamata " valore " è 64 bit, quindi lo faccio:

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

Sì, questo lo copia, ma mi piace la sua leggibilità.

Tieni presente che gli interi a 64 bit hanno restrizioni di allineamento almeno pari agli interi a 32 bit su tutte le piattaforme. Pertanto, è perfettamente sicuro eseguire il cast di un puntatore a un numero intero a 64 bit come puntatore a un 32 bit.

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

Ovviamente, la soluzione di Pax è molto più pulita, ma tecnicamente più efficiente poiché non richiede alcuna copia dei dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top