Question

Existe-t-il un moyen efficace de le faire?

Était-ce utile?

La solution

Vous pourriez utiliser un syndicat pour quelque chose:

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

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

Un exemple (sous Linix utilisant donc différents types):

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

Ceci produit:

27 0

Autres conseils

Je pensais fournir un exemple d'utilisation de LARGE_INTEGER FOR de la plate-forme Windows. Si j'ai une variable appelée "valeur" c'est 64 bits, alors je fais:

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

Oui, cela le copie, mais j'aime sa lisibilité.

N'oubliez pas que les entiers 64 bits ont des restrictions d'alignement au moins égales à celles de 32 bits sur toutes les plateformes. Par conséquent, il est parfaitement prudent de convertir un pointeur en un entier 64 bits en un pointeur en 32 bits.

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

Évidemment, la solution de Pax est beaucoup plus propre, mais elle est techniquement plus efficace car elle ne nécessite aucune copie de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top