Как перевести UINT64 в 2 DWORDS? - PullRequest
1 голос
/ 17 июня 2009

Есть ли эффективный способ сделать это?

Ответы [ 3 ]

4 голосов
/ 17 июня 2009

Это то, что вы могли бы использовать для объединения:

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

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

Пример (под Linix, поэтому используются разные типы):

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

Это производит:

27 0
1 голос
/ 19 июня 2009

Думаю, я приведу пример с использованием LARGE_INTEGER ДЛЯ платформы Windows. Если у меня есть переменная с именем «value», которая является 64-битной, то я делаю:

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

Да, это копирует его, но мне нравится его читабельность.

0 голосов
/ 17 июня 2009

Имейте в виду, что 64-разрядные целые числа имеют ограничения на выравнивание, по крайней мере, равные 32-разрядным целым числам на всех платформах. Поэтому совершенно безопасно привести указатель на 64-разрядное целое число в качестве указателя на 32-разрядное.

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

Очевидно, что решение Pax намного чище, но технически оно более эффективно, поскольку не требует копирования данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...