如何将UINT64转换为2个DWORDS?

时间:2009-06-17 11:05:01

标签: winapi type-conversion

有没有有效的方法来做到这一点?

3 个答案:

答案 0 :(得分:4)

你可以使用联盟:

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 :(得分:1)

以为我会为Windows平台使用LARGE_INTEGER提供一个示例。 如果我有一个名为“value”的变量是64位,那么我会这样做:

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

是的,这会复制它,但我喜欢它的可读性。

答案 2 :(得分:0)

请记住,64位整数的对齐限制至少与所有平台上的32位整数一样大。因此,将指向64位整数的指针转换为指向32位的指针是完全安全的。

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

显然,Pax的解决方案更清晰,但技术上更高效,因为它不需要任何数据复制。