Pergunta

Existe maneira eficiente de fazer isso?

Foi útil?

Solução

Isso é algo que você poderia estar usando uma união para:

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

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

Um exemplo (sob Linix assim usando tipos diferentes):

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

Isto produz:

27 0

Outras dicas

Thought I forneceria um exemplo usando LARGE_INTEGER para a plataforma Windows. Se eu tiver uma variável chamada "valor" que é de 64 bits, então eu faço:

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

Sim, esta copia, mas eu gosto a legibilidade do mesmo.

Tenha em mente que inteiros de 64 bits têm restrições de alinhamento pelo menos tão grande como inteiros de 32 bits em todas as plataformas. Portanto, é perfeitamente seguro para lançar um ponteiro para um inteiro de 64 bits como um ponteiro para a 32-bit.

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

Obviamente, a solução da Pax é um produto de limpeza muito, mas isso é tecnicamente mais eficiente, uma vez que não necessita de quaisquer dados copiando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top