سؤال

على التحول الأيسر من (char) 0xFF بنسبة 8 والقيام بها إلى Int، نحصل على -256 أو 0xFFFFF00. هل يمكن لشخص ما يفسر لماذا يجب أن يحدث هذا؟

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}

الإخراج هو

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

المحلول

char يمكن توقيعها أو غير موقعة - إنه محدد التنفيذ. ترى هذه النتائج بسبب char يتم توقيعه افتراضيا على التحويل البرمجي الخاص بك.

بالنسبة ل Art Schar الموقعة 0xFF، يتوافق مع -1 (هذا هو كيفية عمل مكملان). عند محاولة تحويله، يتم الترويج لأول مرة إلى int ثم تحولت - يمكنك الحصول على الضرب بفعالية بنسبة 256.

لذلك هو هذا الرمز:

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );

نصائح أخرى

عندما نظرت لأول مرة إلى المشكلة، كان رأي الأولي هو أن Char 'C' يجب أن يتحول إلى 8 بت يسارا - جميع البتات 8 التي يتم تجاهلها، ثم يتم إخراج السحر الفارغ إلى Int Value 0.

قليلا من البحوث تكشف تحويلات غير متحركة المعتادة - هذا هو المكان الذي يقلل فيه عدد كبير من الأنواع الحسابية، يتم تطبيق التحويلات تلقائيا على المعاملات من غير المحصنة "!"، "-"، "~"، و لكل معاملات من المشغلين الثنائيين "<<" و ">>".

لذلك يتم تحويل char 'c' إلى int أول, ، ثم تحول اليسار، وإعطاء الإجابة التي تراها.

تتعلم شيئا جديدا كل يوم!

يتم ترقية ج إلى int قبل انتهاء عملية التحول. على افتراض أن تنفيذك يجعل الأحرف التي تم توقيعها بشكل افتراضي، فهذا يعني أنك ستحصل على 0xFFFFFFFFF، والتي يتم إخراجها بعد ذلك لإعطاء النتيجة.

إذا قمت بإجراء C في Char غير موقعة، يجب أن تحصل على ما تتوقعه.

شار ليس سوى شار وقع. سوف char c = 0xFF يكون -1. عندما تركت SHIFT -1 بنسبة 8 بت تحصل عليه -256.

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