casting - Typecasting int to char in printf() in C -
int * int_pointer = malloc (10); * Int_pointer = 53200; Printf ("बाइट # 0 पर पूर्णांक पर सेट है:% d \ n", (char) * int_pointer);
RESULT: -48
इसलिए मैं सिर्फ यह देखने के लिए कोशिश कर रहा था कि क्या होगा और मुझे यह वास्तव में अप्रत्याशित परिणाम मिला।
क्यों -48? यह कैसे नकारात्मक में भी बदल गया?
भाषा-वकील परिप्रेक्ष्य:
I मानना है कि सही संदर्भ में C99 / C11 मानक §6.3.1.3
(जोर खान के साथ):
- जब पूर्णांक प्रकार के साथ एक मान को दूसरे में कनवर्ट किया जाता है
- अन्यथा, यदि नया प्रकार अहस्ताक्षरित है, तो मान को से परिवर्तित कर दिया जाता है < मजबूत> बार-बार जोड़ना या घटाना अधिकतम मूल्य से एक और अधिक है जिसे नए प्रकार में प्रस्तुत किया जा सकता है जब तक कि मूल्य नए प्रकार की सीमा में न हो।
- अन्यथा, नया प्रकार < मजबूत> हस्ताक्षरित और उसमें का प्रतिनिधित्व नहीं किया जा सकता ; या तो परिणाम कार्यान्वयन-परिभाषित या कार्यान्वयन-परिभाषित संकेत उठाया जाता है।
ध्यान दें कि Char
प्रकार समस्याग्रस्त है, क्योंकि यह कार्यान्वयन-परिभाषित है अगर यह वास्तव में हस्ताक्षरित या अहस्ताक्षरित के रूप में प्रतिनिधित्व किया गया है
व्यावहारिक दृष्टिकोण:
यह मान कर कि आपके कार्यान्वयन के लिए Sizeof (int) == 4
और यह हस्ताक्षरित पूर्णांक संचय करने के लिए दो पूरक पद्धति का उपयोग करता है, संख्या 53200
इस प्रकार है:
0000 0000 0000 0000 1100 1111 1101 0000
ध्यान दें कि यदि आपके पास बहुत कम एंडियन सीपीयू (शायद यह सही धारणा है), तो बाइट्स का ऑर्डर, या अधिक सख्ती से कैसे वे वास्तव में मेमोरी और सीपीयू रजिस्टरों में संग्रहीत हैं उल्टे, यानी वह नंबर इस रूप में संग्रहीत है:
0000 1101 1111 1100 0000 0000 0000 0000
क्या (अहस्ताक्षरित चार) 53200
उत्पादन होता है के रूप में (ध्यान दें कि मानक गारंटी देता है कि sizeof (अहस्ताक्षरित चार) == 1
):
53200 - 256 - 256 - (के रूप में विशुद्ध रूप से गणितीय अर्थ में) का आधार। .. - 256 = 53200% 256 = 208
जो द्विआधारी 1101 0000 में है
यह गणितीय साबित हो सकता है कि परिणाम हमेशा होता है "कट-ऑफ" के समान, कलाकारों के परिणामस्वरूप केवल अंतिम, कम-महत्वपूर्ण बाइट को आराम करना।
printf ()
:
के लिए नोट @pmg printf ()
द्वारा इंगित किया गया है भिन्न प्रकार का कार्य और डिफ़ॉल्ट तर्क प्रचार इसकी वैकल्पिक तर्कों के प्रकार अहस्ताक्षरित चार
(या हस्ताक्षरित) के कारण चार
और char
भी) हमेशा को int
में पदोन्नत कर रहे हैं, लेकिन इस बार यह "सिर्फ एक औपचारिकता" है।
वैकल्पिक biwise ऑपरेटर समाधान के लिए नोट:
ए उदाहरण के लिए:
कोड> * int_number & amp; 0xff / * मुखौटा 0000 0000 0000 0000 1111 1111 है * /
Comments
Post a Comment