मैं सी के लिए नया हूं, मान लीजिए कि मैं एक छोटा इंट प्रिंट करना चाहता हूं:

short s = 0xbeef;
printf("This is 0x%x", s);

आउटपुट 0xffffbeef है

और ऐसा लगता है कि short में चार बाइट हैं, लेकिन वास्तव में short में केवल दो बाइट्स हैं, तो %x इसे ठीक से प्रिंट क्यों नहीं कर सकते? और यदि इसका नियम है कि न्यूनतम 4 बाइट्स प्रतिनिधित्व की आवश्यकता है तो आउटपुट 0x0000beef के बजाय 0xffffbeef क्यों है?

c
-1
slowjams 14 जून 2020, 13:27

2 जवाब

और ऐसा लगता है कि शॉर्ट में चार बाइट्स हैं, लेकिन वास्तव में शॉर्ट में केवल दो बाइट्स हैं, तो %x इसे ठीक से प्रिंट क्यों नहीं कर सकता?

s का हस्ताक्षरित मान -16657 है। जब आप इसे प्रिंटफ को पास करते हैं तो इसे int में प्रचारित किया जा रहा है। प्रचारित मान में 0xffffbeef (Two's_complement फ़ॉर्मैट) का 32 बिट प्रतिनिधित्व है। . यही कारण है कि आप इस संख्या को देखते हैं क्योंकि आप अहस्ताक्षरित पूर्णांक को अहस्ताक्षरित कम नहीं आउटपुट करना चाहते थे। https://godbolt.org/z/qKwzUv

सही प्रारूप का प्रयोग करें और सब कुछ ठीक हो जाएगा...

https://en.cppreference.com/w/cpp/io के अच्छे लोग /c/fprintf ने यह सुंदर तालिका बनाई:

अब उस पंक्ति की जाँच करें जहाँ x (और X) प्रारूप का वर्णन किया गया है। अहस्ताक्षरित लघु पूर्णांक ज्ञात कीजिए और आप इसे कॉलम h में पाते हैं। तो प्रारूप %hx या %hX है

enter image description here https://godbolt.org/z/wQCa9p

0
P__J__ 14 जून 2020, 11:05

इसका कारण यह है कि C कैसे काम करता है। जब आप 2-बाइट शॉर्ट घोषित करते हैं, तो अंत में अन्य 2 बाइट सभी 1 के साथ भर जाते हैं। इसका अर्थ है कि यदि आप लिखते हैं:

short x = 0x2f

और उसके बाद इसे प्रिंट करें:

printf("0x%x", x);

आपको निम्न आउटपुट मिलेगा:

0xffff002f

क्योंकि C उन अंतिम दो बाइट्स को अंत में भर रहा है (क्योंकि आपके सिस्टम का आर्किटेक्चर इस क्रॉपिंग के कारण 64-बिट हो सकता है), F के साथ। ऐसा इसलिए है क्योंकि डिफ़ॉल्ट रूप से C ऐसा करता है इसलिए यह 64 और 32 बिट सिस्टम पर काम कर सकता है। इसलिए यह ऐसा करेगा ताकि अंतिम दो बाइट्स कुछ यादृच्छिक संख्या न हों, क्योंकि सिस्टम में मेमोरी हमेशा बदलती रहती है।

उदाहरण के लिए, मान लें कि मेरे पास 32-बिट सिस्टम था जिसमें कुछ मेमोरी इस तरह थी:

0x00002f00 0x2e0209ff 0x440effef 0x2efef03d

और मैंने एक शॉर्ट के साथ एक सी प्रोग्राम लिखा जो इसे स्मृति में स्थान 0x00000001 (0x2e0209ff ऊपर दिए गए आरेख में) में संग्रहीत करता है। अगर मैंने एफ के साथ ऊपरी 2 बाइट्स को मास्क किए बिना ऐसा किया तो मुझे मिलेगा:

0x2e02xxxx

जहां XXXX मेरे लघु का प्रतिनिधित्व करता है। जैसा कि आप देख सकते हैं, यह स्मृति में कुछ विसंगति का परिणाम है, और इसलिए सी उन 2 ऊपरी बाइट्स को एफ के साथ क्षतिपूर्ति करने के लिए मास्क करता है।

आप इस समस्या का उपयोग करके ठीक कर सकते हैं:

printf("This is 0x%04x", s);

आशा है कि यह आपकी समस्या को ठीक करता है :)

-1
sciencepiofficial 14 जून 2020, 10:40