जब हम 8 बिट संख्याओं पर अंकगणितीय ऑपरेशन करते हैं, तो उन्हें पूर्णांक में बढ़ावा दिया जाता है। मेरे पास कोड स्निपेट के नीचे है।

unsigned char startTime=7;
unsigned char endTime=5;  
unsigned char diff = endTime-startTime;

मैं समझता हूं कि, आरएचएस में, दोनों को पूर्णांक में पदोन्नत किया जाता है और इसलिए परिणाम -2 है और अंतिम परिणाम 254 है। मैं जानना चाहता हूं कि वास्तव में संकलक यह कैसे करता है। मैंने यही महसूस किया, लेकिन यकीन नहीं हुआ। कंपाइलर दोनों को पूर्णांक में बढ़ावा देता है। परिणाम के लिए अस्थायी पूर्णांक चर बनाया जाता है। अंकगणितीय ऑपरेशन किया जाता है। 5-7 = 0xFFFF FFFF FFFF FFFE का परिणाम। अब LHS को केवल 8 बिट 0xFE असाइन करें और सभी उच्च 3 बाइट्स छीन लिए जाएं। इसलिए अगर हम इसे प्रिंट करते हैं तो हमें 254 दिखाई देते हैं।

1
Rajesh 1 सितंबर 2019, 18:14

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि आप ध्यान दें, startTime और endTime को int में पदोन्नत किया गया है, और endTime-startTime का परिणाम −2 है। C मानक इस व्यवहार का वर्णन मान के रूप में करता है जो परिणाम देता है, जो −2 है। यह बिट्स के संदर्भ में व्यवहार का वर्णन नहीं करता है जो परिणाम को एन्कोड करता है; यह अनिवार्य नहीं है कि परिणाम 11111111111111111111111111111111110 बिट्स द्वारा दर्शाया जाए।

कई सी कार्यान्वयन में, अनिवार्य रूप से सभी सामान्य आधुनिक कार्यान्वयन, दोनों की पूरक प्रणाली का उपयोग हस्ताक्षरित पूर्णांक के लिए किया जाता है, जिसमें -2 के लिए 32-बिट प्रतिनिधित्व 11111111111111111111111111111111110 है। लेकिन सी मानक भी किसी के पूरक का उपयोग करने की अनुमति देता है (जिसमें -2 11111111111111111111111111111111101 है ) या साइन-एंड-परिमाण (जिसमें -2 10000000000000000000000000000010 है)।

कोई फर्क नहीं पड़ता कि किस प्रणाली का उपयोग किया जाता है, −2 को आठ-बिट unsigned char में परिवर्तित करने का परिणाम 254 है। (C unsigned char को आठ बिट्स से अधिक चौड़ा करने की अनुमति देता है, लेकिन यह उत्तर इसका समाधान नहीं करता है।) ऐसा इसलिए है क्योंकि सी मानक निर्दिष्ट करता है कि एक पूर्णांक मान को unsigned char में परिवर्तित करने का परिणाम unsigned char प्रकार के डोमेन में मान है जो UCHAR_MAX+1 को बार-बार जोड़कर या घटाकर प्राप्त किया जाता है। यही है, यह मान मॉड्यूलो 256 में परिवर्तित किया जा रहा है। -2 के लिए, हमारे पास -2 + 256 = 254 है, इसलिए सी मानक के लिए आवश्यक परिणाम 254 है।

चूंकि सी मानक द्वारा इस परिणाम की आवश्यकता होती है कि क्या दो के पूरक, एक के पूरक, या साइन-एंड-परिमाण का उपयोग किया जाता है, सी कंपाइलर (या संपूर्ण सी कार्यान्वयन) इस परिणाम को प्राप्त करने के लिए जो कुछ भी आवश्यक है उसे करने के लिए जिम्मेदार है। जब दो के पूरक का उपयोग किया जाता है, तो सभी कंपाइलर को int प्रतिनिधित्व के निम्न आठ बिट्स लेना होता है और उन्हें unsigned char प्रतिनिधित्व के बिट्स के रूप में उपयोग करना होता है। यह एक कारण है कि आज दो के पूरक को पसंद किया जाता है। यदि सी कार्यान्वयन किसी के पूरक या साइन-एंड-परिमाण का उपयोग कर रहा था, तो −2 int मान को 254 unsigned char मान में बदलने के लिए जो भी कार्य आवश्यक है, उसे करने के लिए यह जिम्मेदार होगा।

1
Eric Postpischil 1 सितंबर 2019, 15:44