2009-06-17 5 views

Antwort

4

Das ist etwas, was Sie für eine Vereinigung verwenden könnte:

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

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

Ein Beispiel (unter Linix so unterschiedliche Typen verwenden):

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

Dies erzeugt:

27 0 
+0

Oder verwenden Sie einfach die integrierte ULARGE_INTEGER Union, siehe http://msdn.microsoft.com/en-us/library/aa383742(VS.85).aspx – eran

+0

Ja, ich kenne die Frage Win32, aber ich bevorzuge immer noch meinen Code, um beweglich zu sein (nicht abhängig von der Plattform). – paxdiablo

+0

Pax, Ihr Code ist auch nicht portabel - wohlgemerkt, die Breite von int und long unterscheidet sich zwischen Plattformen und kann sogar gleich sein. –

0

Halten Beachten Sie, dass 64-Bit-Ganzzahlen Ausrichtung Einschränkungen mindestens so groß wie 32-Bit-Ganzzahlen auf allen Plattformen haben. Daher ist es absolut sicher, einen Zeiger auf eine 64-Bit-Ganzzahl als Zeiger auf ein 32-Bit zu setzen.

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

Offensichtlich ist Pax-Lösung viel saubere, aber dies ist technisch effizienter, da es kein Datenkopieren erfordert.

1

Ich dachte, ich würde ein Beispiel mit LARGE_INTEGER für die Windows-Plattform bereitstellen. Wenn ich eine Variable mit dem Namen „Wert“ habe, die 64-Bit ist, dann mache ich:

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

Ja, das kopiert, aber Ich mag die Lesbarkeit davon.

Verwandte Themen