سؤال

أحاول إنشاء INT64 كبيرة مع معلومات Nibble المخزنة في بايت.

خطوط العمل التالية من التعليمات البرمجية كما هو متوقع:

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x1000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000));

لماذا يؤدي السطر التالي إلى خطأ في الترجمة CS0220 "عملية تفيضات في وقت الترجمة في الوضع المحدد" والآخرين لا؟

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x10000000));

ستكون النتيجة:

FFFFFFFFD0000000

بدلا من:

0000D0000000

هل يمكن لأي شخص أن يفسر هذا؟ سأحول الآن مع مشغلي التحول، ولكن لا يزال فضولي سبب عدم عمل هذا النهج!

تحديث: يحدث الخطأ أيضا عند استخدام (Int64) (0x0d << 28).

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

المحلول

تحتاج إلى وضع علامة على القيم المستمرة خصيصا طالما يتوق (UNT64S) أو ربما Ulongs (UINT64S)، وإلا افتراضيا، فستكون مترجمين فهي مفتروسة ك Intts (IE Int32s)، مما تسبب بوضوح في الفيضان. الصب بعد عملية الضرب لن تفعل لك أي شيء جيد في هذه الحالة.

لم يتم اختبارها، ولكن يجب أن يعمل هذا الرمز:

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);

نصائح أخرى

عدد صحيح يعرف حرف INT32 (حتى إذا كان في عرافة). استخدم لاحقة "L" لجعلها يتوق (Int64).

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);

النظرة الأولى أعتقد أنها تقوم بعمل الضرب مع INT32، وضغط. تحتاج إلى إلقاء المعاملات الفردية إلى Int64 ثم اضرب تلك. الآن أنت فقط صب النتيجة فقط.

ومع ذلك، لا أعرف لماذا سيجد مشكلة فقط مع هذا السطر واحد وليس أول واحد مع الرقم الأكبر.

اختصار الثاني

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