/ / इस कार्यक्रम के उत्पादन के बारे में भ्रम - सी

इस कार्यक्रम के आउटपुट के बारे में भ्रम - सी

मैं C प्रोग्रामिंग में नया हूं और मैं वर्तमान में डेटा प्रकार संशोधित अध्याय सीख रहा हूं। नीचे में कार्यक्रम, मेरा ओ / पी 36 है, लेकिन संकलक ओ / पी 35 दिखा रहा है।

main( )
{
char ch = 291 ;
printf ( "n%d %c", ch, ch ) ;
}

क्या कोई मुझे समझा सकता है कि ओ / पी 35 क्यों आ रहा है? मैं वर्तमान में जीसीसी 32-बिट संकलक का उपयोग कर रहा हूं।

उत्तर:

जवाब के लिए 3 № 1

आप वास्तव में एक अतिप्रवाह बना रहे हैं। एक हस्ताक्षरित चरित्र केवल मान -128 से 127 (256 मान = 2) तक जा सकता है8) 8-बिट कैरेक्टर सिस्टम में (जो हर जगह बहुत ज्यादा हैं)। तो हम एक वास्तविक चरित्र के साथ चलते हैं जो मूल्य 291% 256 = 35 के बराबर है।

डॉन "यह मत भूलो कि पहला चरित्र 0 है, 1 नहीं।

यहाँ वास्तव में कैसे एक चर के साथ प्रतिनिधित्व किया है 2 की पूरक प्रणाली:

unsigned
0 ------- 127 128 ------- 255

signed
0 ------- 127 -128 ------- -1

तो वास्तव में ए signed char c1 = -128 के बराबर है unsigned char c2 = 128

लेकिन यहां यह समस्या सिर्फ अप्रासंगिक है। हम मॉडुलो के बारे में बात कर रहे हैं क्योंकि केवल पिछले आठ बिट्स को ध्यान में रखा जाता है (जब मेमोरी में इसके लिए केवल आठ बिट्स उपलब्ध हैं?)

291 = % 1 0010 0011

(% बाइनरी प्रतिनिधित्व का मतलब है)

यह केवल रखता है % 0010 0011 जो बराबर है 35 और जिस पर विचार किया जाएगा, या तो आप इसे हस्ताक्षरित करेंगे या नहीं।


जवाब के लिए 8 № 2

आपके सिस्टम में स्पष्ट रूप से 8-बिट है char प्रकार। इसका मत 291 फिट होने के लिए बहुत बड़ा है - संकलक इसे मोडुलो 256 (2) कम कर देता है8) और आप 35 के साथ समाप्त होते हैं।

इस मामले में, बजना एक महान चेतावनी प्रदान करता है:

example.c:3:11: warning: implicit conversion from "int" to "char" changes value
from 291 to 35 [-Wconstant-conversion]
char ch = 291 ;
~~   ^~~

आपको शायद इस व्यवहार पर भरोसा करने से बचना चाहिए, क्योंकि यह कार्यान्वयन से कार्यान्वयन तक भिन्न हो सकता है। C99 और C11 स्पेक्स (धारा 6.3.1.3) हस्ताक्षरित पूर्णांक रूपांतरणों के बारे में कहते हैं:

अन्यथा, नए प्रकार पर हस्ताक्षर किए गए हैं और इसमें मूल्य का प्रतिनिधित्व नहीं किया जा सकता है; या तो परिणाम कार्यान्वयन-परिभाषित है या कार्यान्वयन-परिभाषित संकेत उठाया जाता है।

चूंकि आप "जीसीसी का उपयोग कर रहे हैं, आप इस अंश को पढ़ने के लिए इच्छुक हो सकते हैं।" दस्तावेज़ीकरण:

जब किसी मान को उस प्रकार की वस्तु (C90 6.2.1.2, C99 6.3.1.3) में प्रस्तुत नहीं किया जा सकता है, तो पूर्णांक को एक पूर्णांक पूर्णांक प्रकार में परिवर्तित करने के द्वारा या उसके संकेत का परिणाम होता है।.

एक प्रकार की चौड़ाई एन में रूपांतरण के लिए, मूल्य कम होता है modulo 2एन प्रकार की सीमा के भीतर होना; कोई संकेत नहीं उठाया।

और आपके पास कटौती मोडुलो 256 की आपकी पूरी व्याख्या है।


जवाब के लिए 3 № 3

क्योंकी ये char केवल 8 बिट्स की जानकारी हो सकती है, और 291 को संग्रहीत करने की आवश्यकता होती है। यह तब उच्च बिट्स को त्याग देगा और चर में जो भी फिट होगा उसे रखेगा।

आप बिटवाइस और मॉड्यूल ऑपरेशन दोनों द्वारा अनुकरण कर सकते हैं:

291% 256 = 35

291 और 0xFF = 35

8-बिट चार्ट में -128 का मूल्य 127 या 0 से 255 हो सकता है, जो कि इसके हस्ताक्षरित या अहस्ताक्षरित होने पर निर्भर करता है।