"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يقوم fmt.Printf بإخراج \"-101\" لعدد صحيح موقّع ممثل في تكملة اثنين؟

لماذا يقوم fmt.Printf بإخراج \"-101\" لعدد صحيح موقّع ممثل في تكملة اثنين؟

تم النشر بتاريخ 2024-11-13
تصفح:149

Why Does fmt.Printf Output \

مكمل اثنان و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