الارتباك المحيط بالتحويل من uint8 إلى int8
يمكن أن يؤدي تحويل uint8 إلى int8 في Go إلى سلوك غير متوقع، كما هو موضح في ما يلي مثال:
package main
import (
"fmt"
)
func main() {
a := int8(0xfc) // Compile error: constant 252 overflows int8
}
فشل الكود بسبب خطأ في وقت الترجمة لأن الثابت 0xfc يتجاوز نطاق int8 (-128 إلى 127). ومع ذلك، يتم تجميع التعليمات البرمجية التالية دون أخطاء:
package main
import (
"fmt"
)
func main() {
a := 0xfc
b := int8(a) // Ok
}
الفرق يكمن في ترتيب العمليات. في المثال الأول، يتم تحويل الثابت إلى int8 قبل تعيينه إلى ملف. في المثال الثاني، تم تعيين القيمة a أولاً 0xfc، ثم تم تحويلها إلى int8.
وفقًا لمواصفات لغة Go، يجب أن تكون التعبيرات الثابتة قابلة للتمثيل بواسطة النوع الثابت. في هذه الحالة، لا يمكن تمثيل 0xfc بواسطة int8، مما يؤدي إلى خطأ في الترجمة.
ومع ذلك، عند إجراء التحويل بعد التعيين، تكون قيمة a (التي لم تعد ثابتة) ضمن نطاق int8، مما يسمح بنجاح التحويل.
بالنسبة لحالات الاستخدام العملي، خذ بعين الاعتبار المثال التالي:
type Char byte
var c Char = '世' // Error: '世' has value 0x4e16, too large.
&&&]يثير هذا الرمز خطأ لأن قيمة الثابت '世' (0x4e16) تتجاوز نطاق البايت ( 0 إلى 255). لإصلاح ذلك، يمكن للمرء استخدام التقنية التالية:var c Char = Char('世') // Ok
في هذه الحالة، يتم تعيين '世' أولاً إلى نوع بايت ثم يتم تحويله إلى Char. وهذا يضمن أن القيمة تقع ضمن نطاق نوع Char. يمكن تطبيق تقنيات مماثلة عند تحويل البايتات إلى int32 مع مراعاة إشارة القيمة الناتجة. تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3