سؤال

لدي استفسار أساسي للغاية.للكود التالي:

int i = -1;
unsigned int j = (unsigned int) i;
printf("%d",j); // I get 65535 the int limit in turbo C 16 bit compiler

ألا ينبغي ببساطة إسقاط الإشارة السالبة أم أنها تلتف حول الحدود؟

هل كانت مفيدة؟

المحلول

يسمى المخطط الأكثر استخدامًا لتمثيل الأرقام السالبة متمم ثنائي.في هذا المخطط -1 لديه نمط بت للجميع 1 أجزاء: 1111 1111 1111 1111.عندما يتم تفسيره على أنه عدد صحيح غير موقّع، وهو ما يعنيه فريقك، فهو 65535.

وبعبارة أخرى، فإنه "يقوم ببساطة بإسقاط الإشارة السالبة"، إلا أن القيام بذلك له تأثير مختلف عما تتوقعه.

نصائح أخرى

عند تحويل int ل unsigned int, ، إذا كانت القيمة سالبة تكون النتيجة كما لو أن تلك القيمة السالبة قد أضيفت إلى الرقم واحد أكبر مما هو عليه unsigned int هل تستطيع الامساك.يتم تحديد هذا بواسطة معيار C منذ C90، ويتم تطبيقه بغض النظر عما إذا كانت الآلة تستخدم تمثيلات الحجم المكملة الثنائية أو المكملة للفرد أو الحجم الموقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top