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