2009-06-17 8 views

Répondre

4

C'est quelque chose que vous pourriez utiliser une union pour:

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 donc en utilisant 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; 
} 

Ce produit:

27 0 
+0

Ou tout simplement utiliser l'Union ULARGE_INTEGER intégré, voir http://msdn.microsoft.com/en-us/library/aa383742(VS.85).aspx – eran

+0

Oui, je sais que la question a déclaré Win32, mais je préfère toujours mon code pour être portable (ne dépendant pas de la plate-forme). – paxdiablo

+0

Pax, votre code n'est pas portable non plus - attention, la largeur de int et long diffère entre les plates-formes et peut même être égale. –

0

Conserver en gardant à l'esprit que les entiers 64 bits ont des restrictions d'alignement au moins aussi grandes que les entiers 32 bits sur toutes les plates-formes. Par conséquent, il est parfaitement sûr de lancer un pointeur vers un entier 64 bits en tant que pointeur sur un 32 bits.

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

De toute évidence, la solution de Pax est beaucoup plus propre, mais cela est techniquement plus efficace car il ne nécessite pas de copie de données.

1

Je pensais fournir un exemple en utilisant LARGE_INTEGER pour la plate-forme Windows. Si j'ai une variable appelée « valeur » qui est 64 bits, puis-je faire:

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

Oui, cette copie, mais j'aime la lisibilité de celui-ci.

Questions connexes