Frage

Gibt es eine effiziente Art und Weise, dies zu tun?

War es hilfreich?

Lösung

Das ist etwas, das Sie könnte eine Vereinigung für werden:

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 mit verschiedenen Arten):

#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

Andere Tipps

Ich dachte, ich würde ein Beispiel liefern mit LARGE_INTEGER für die Windows-Plattform. 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, dies kopiert, aber Ich mag die Lesbarkeit davon.

Beachten Sie, dass 64-Bit-Integer Ausrichtung Einschränkungen mindestens so groß ist wie 32-Bit-Integer auf allen Plattformen haben. Daher ist es absolut sicher einen Zeiger auf einen 64-Bit-Integer als Zeiger auf einen 32-Bit zu werfen.

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top