문제

이 작업을 수행하는 효율적인 방법이 있습니까?

도움이 되었습니까?

해결책

그것은 당신이 다음을 위해 노조를 사용할 수있는 것입니다.

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

다른 팁

Windows 플랫폼에 marge_integer를 사용하여 예제를 제공 할 것이라고 생각했습니다. 64 비트 인 "value"라는 변수가 있으면 다음을 수행합니다.

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

예, 이것은 복사하지만, 나는 그것의 가독성을 좋아합니다.

64 비트 정수는 모든 플랫폼에서 최소한 32 비트 정수만큼 정렬 제한을 가지고 있습니다. 따라서 32 비트의 포인터로 64 비트 정수에 대한 포인터를 캐스트하는 것이 안전합니다.

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

분명히 PAX의 솔루션은 훨씬 더 깨끗하지만 데이터 복사가 필요하지 않기 때문에 기술적으로 더 효율적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top