سؤال

هل هناك طريقة فعالة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

وهذا شيء يمكن أن يستخدم الاتحاد ل:

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

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

مثال (تحت ينيكس وذلك باستخدام أنواع مختلفة):

#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 للمنصة ويندوز. إذا كان لدي متغير يسمى "قيمة" هذا هو 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 ] );

ومن الواضح أن حل باكس هو أنظف كثيرا، ولكن هذا من الناحية الفنية أكثر كفاءة لأنها لا تتطلب أي نسخ البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top