Как перевести UINT64 в 2 DWORDS?
-
06-07-2019 - |
Вопрос
Есть ли эффективный способ сделать это?
Решение
Это то, что вы могли бы использовать для объединения:
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
Другие советы
Я хотел бы привести пример, использующий LARGE_INTEGER для платформы Windows. Если у меня есть переменная с именем " значение " это 64 бит, тогда я делаю:
LARGE_INTEGER li;
li.QuadPart = value;
DWORD low = li.LowPart;
DWORD high = li.HighPart;
Да, это копирует его, но мне нравится удобочитаемость. Р>
Имейте в виду, что 64-разрядные целые числа имеют ограничения на выравнивание, по крайней мере, такие же, как 32-разрядные целые числа на всех платформах. Поэтому совершенно безопасно привести указатель на 64-разрядное целое число в качестве указателя на 32-разрядное.
ULONGLONG largeInt;
printf( "%u %u\n", ((DWORD *)&largeInt)[ 0 ], ((DWORD *)&largeInt)[ 1 ] );
Очевидно, что решение Pax намного чище, но технически оно более эффективно, поскольку не требует копирования данных.