مكمل اثنان وfmt.Printf إخراج ثنائي
عندما تستخدم أجهزة الكمبيوتر مكمل اثنين لتمثيل الأعداد الصحيحة الموقعة، يتم تخزين قيمة مثل -5 كـ نمط البت "1111 1011." ومع ذلك، عند محاولة طباعة هذا التمثيل الثنائي باستخدام fmt.Printf مثل هذا:
var i int8 = -5
fmt.Printf("%b", i)
يظهر الإخراج بشكل غير متوقع "-101." لماذا يحدث هذا، وهل يتم استخدام تكملة Two داخليًا؟
مشكلة التنسيق الثنائي
يكمن التناقض في الطريقة التي يتعامل بها fmt.Printf مع التنسيق الثنائي. عند تنسيق عدد صحيح بعلامة سالبة، فإنه يحوله إلى قيمة موجبة ثم يُلحق علامة '-' قبل السلسلة المنسقة.
بالنظر إلى الكود المصدري لـ fmt.Printf، نجد أن fmt.integer يحول عدد صحيح موقّع إلى قيمة موجبة قبل تنسيقه:
negative := signedness == signed && a الإخراج غير الموقع مقابل الإخراج الموقع
لتوضيح ذلك، ضع في اعتبارك هذا الكود:
var u uint8 = uint(i)
fmt.Printf("%b", u)
هنا، نقوم بتحويل i إلى عدد صحيح غير موقّع قبل طباعته. هذه المرة، يُظهر الإخراج بشكل صحيح "11111011،" وهو المكمل الثنائي لـ -5.
الاستنتاج
لطباعة التمثيل الثنائي لعدد صحيح موقّع بشكل صحيح باستخدام fmt.Printf، يجب علينا أولاً تحويله إلى عدد صحيح موجب باستخدام نوع غير موقّع. وهذا يضمن أن fmt.Printf لا يقوم تلقائيًا بتحويل القيمة إلى قيمة سالبة ويضع علامة '-' في المقدمة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3