2009-07-08 4 views
11

पर डालें (चार) 0xff की बायीं तरफ 8 और इसे int में कास्टिंग करने के लिए हमें -256 या 0xffffff00 मिलता है। क्या कोई यह समझा सकता है कि ऐसा क्यों होना चाहिए?सी में बाएं शिफ्ट (चार) 0xFF 8 तक और इसे int

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

आउटपुट

-256 ffffff00 

उत्तर

14

char हस्ताक्षरित या हस्ताक्षरित किया जा सकता है - यह कार्यान्वयन-परिभाषित है। आप इन परिणामों को देखते हैं क्योंकि char आपके कंपाइलर पर डिफ़ॉल्ट रूप से हस्ताक्षरित है।

हस्ताक्षरित चार 0xFF के अनुरूप -1 (इस तरह दो पूरक पूरक है)। जब आप इसे शिफ्ट करने की कोशिश यह पहली बार एक int के लिए प्रोत्साहित किया जाता है और फिर स्थानांतरित कर दिया - आप प्रभावी रूप से 256

द्वारा गुणा मिलता है तो यह इस कोड है:

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

चार के अलावा कुछ नहीं पर हस्ताक्षर किए चार है। तो चार सी = 0xFF -1 होगा। जब आप 8 बिट्स द्वारा शिफ्ट -1 छोड़ देते हैं तो आपको -256 मिलता है।

+11

char की हस्ताक्षर कार्यान्वयन परिभाषित किया गया है। –

3

ग से पहले एक पूर्णांक के लिए प्रोत्साहित किया जा रहा है शिफ्ट ऑपरेशन किया जाता है। आपके कार्यान्वयन को मानते हुए वर्ण डिफ़ॉल्ट रूप से हस्ताक्षर किए जाते हैं, इसका मतलब है कि आपको 0xffffffff प्राप्त करने जा रहे हैं, जिसे आपके परिणाम देने के लिए बाएं स्थानांतरित किया जाता है।

यदि आप एक हस्ताक्षरित चार में सी बनाते हैं, तो आपको जो चाहिए वह प्राप्त करना चाहिए।

7

जब मैंने पहली बार समस्या को देखा, तो मेरा प्रारंभिक विचार यह था कि चार 'बिट' को 8 बिट्स को छोड़ दिया जाना चाहिए - सभी 8 बिट्स को त्याग दिया जा रहा है, खाली चार को मूल्य 0 के मूल्य में डाला जाएगा।

कुछ शोध से पता चलता है सामान्य यूनरी रूपांतरण - यह बड़ी संख्या में अंकगणितीय प्रकार को कम करने के लिए है, रूपांतरणों को स्वचालित रूप से असाइन '!', '-', '~' और '*' के संचालन के लिए लागू किया जाता है। ऑपरेटर, और द्विआधारी '< <' और '>>' ऑपरेटरों के प्रत्येक संचालन के लिए।

इसलिए char 'c' को int पहले में परिवर्तित कर दिया गया है, फिर बाईं ओर स्थानांतरित किया गया है, जो आपको दिखाई देता है।

आप हर दिन कुछ नया सीखते हैं!

संबंधित मुद्दे