لماذا تجاوز عملية التشغيل هذه (CF. CS0220) في C #؟
-
23-08-2019 - |
سؤال
أحاول إنشاء 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 ثم اضرب تلك. الآن أنت فقط صب النتيجة فقط.
ومع ذلك، لا أعرف لماذا سيجد مشكلة فقط مع هذا السطر واحد وليس أول واحد مع الرقم الأكبر.
اختصار الثاني