क्या CHAR_MAX के चारों ओर लपेटने के लिए CHAR_MAX के लिए एक चार्ट मूल्य निर्धारित किया गया है?


10

मेरा कोड:

#include <stdio.h>
#include <limits.h>

int main()
{
    char c = CHAR_MAX;
    c += 1;
    printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c);
}

आउटपुट:

CHAR_MIN=-128 CHAR_MAX=127 c=-128 ()

हम देखते हैं कि जब हम एक charवैरिएबल सेट को बढ़ाते हैं CHAR_MAX, तो वह इधर-उधर हो जाता है CHAR_MIN। क्या इस व्यवहार की गारंटी है? या क्या यह अपरिभाषित व्यवहार या कार्यान्वयन-निर्दिष्ट व्यवहार होने जा रहा है? इस बारे में C99 मानक क्या कहता है?

[नोट: क्या होता है जब CHAR_MAX (127) से बड़ा मूल्य चार या सी को दिया जाता है- चार सी = 129 क्यों -127 में बदल जाएगा? इस प्रश्न को संबोधित नहीं करता है क्योंकि वे एक आउट-ऑफ-रेंज मान निर्दिष्ट करने के बारे में बात करते हैं, एक मूल्य-आउट-ऑफ़-रेंज मान बढ़ाने के लिए नहीं।]


वेतन वृद्धि एक असाइनमेंट है।
विलियम पर्ससेल

2
यह इस पर निर्भर करता है कि चार पर हस्ताक्षर किए गए हैं या अहस्ताक्षरित हैं। हस्ताक्षरित पूर्णांक का अतिप्रवाह अपरिभाषित व्यवहार है। तो आउटपुट कुछ भी हो सकता है।
डब्लर

जवाबों:


15

सवाल दुगना है: सबसे पहले, है

char c = CHAR_MAX;
c += 1;

से अलग मूल्यांकन किया

char c = CHAR_MAX;
c = c + 1;

और जवाब है कि यह नहीं है , क्योंकि C11 / C18 6.5.16.2p3 :

  1. प्रपत्र E1 op = E2का एक यौगिक असाइनमेंट साधारण असाइनमेंट अभिव्यक्ति के बराबर है E1 = E1 op (E2)सिवाय इसके कि लैवल्यू E1का केवल एक बार मूल्यांकन किया जाता है, और एक अनिश्चित-अनुक्रम अनुक्रम फ़ंक्शन कॉल के संबंध में, एक यौगिक असाइनमेंट का संचालन एक एकल मूल्यांकन है। यदि E1एक परमाणु प्रकार है, तो यौगिक असाइनमेंट memory_order_seq_cstमेमोरी ऑर्डर शब्दार्थ के साथ एक रीड-संशोधित-राइट-ऑपरेशन है । 113)

फिर, सवाल यह है कि क्या होता है c = c + 1। यहाँ ऑपरेंड के लिए +हमेशा की तरह गणित रूपांतरण से गुजरना है, और cऔर 1इसलिए करने के लिए प्रोत्साहित कर रहे हैं int, जब तक कि एक वास्तव में निराला वास्तुकला की आवश्यकता है कि charकरने के लिए प्रोत्साहित किया जाता है unsigned int+तब की गणना का मूल्यांकन किया जाता है, और परिणाम int/ प्रकार unsigned intको वापस में बदल दिया जाता है charऔर संग्रहीत किया जाता है c

हैं 3 कार्यान्वयन से परिभाषित तरीकों से इस तो मूल्यांकन किया जा सकता:

  • CHAR_MIN0 है और इसलिए charअहस्ताक्षरित है।

    या तो charइसे पदोन्नत किया जाता है intया unsigned intयदि इसे बढ़ावा दिया जाता है int, तो CHAR_MAX + 1आवश्यक रूप से एक में फिट intहोगा, और अतिप्रवाह नहीं होगा, या यदि unsigned intयह फिट हो सकता है या शून्य के आसपास लपेट सकता है। परिणामस्वरूप मूल्य, जो या तो संख्यानुसार है जब CHAR_MAX + 1या 0सापेक्ष कमी, वापस करने के बाद c, सापेक्ष कमी के बाद यह 0 बन जाएगा, यानीCHAR_MIN

  • अन्यथा charहस्ताक्षरित है, तो यदि इससे CHAR_MAX छोटा है INT_MAX, तो परिणाम CHAR_MAX + 1एक फिट होगा int, और मानक C11 / C18 6.3.1.3p3 रूपांतरण पर लागू होता है जो असाइनमेंट पर होता है :

    1. अन्यथा, नए प्रकार पर हस्ताक्षर किए गए हैं और इसमें मूल्य का प्रतिनिधित्व नहीं किया जा सकता है; या तो परिणाम कार्यान्वयन-परिभाषित है या कार्यान्वयन-परिभाषित संकेत उठाया जाता है।
  • या, यदि if sizeof (int) == 1 और char हस्ताक्षर किए गए हैं, तो a charमें पदोन्नत किया जाता है int, और CHAR_MAX == INT_MAX=> CHAR_MAX + 1एक पूर्णांक अतिप्रवाह का कारण होगा और व्यवहार अपरिभाषित होगा

यानी संभावित परिणाम हैं:

  • यदि charकोई अहस्ताक्षरित पूर्णांक प्रकार है, तो परिणाम हमेशा होता है 0, अर्थात CHAR_MIN

  • अन्यथा charएक हस्ताक्षरित पूर्णांक प्रकार है, और व्यवहार कार्यान्वयन-परिभाषित / अपरिभाषित है:

    • CHAR_MIN या कुछ अन्य कार्यान्वयन-परिभाषित मूल्य,
    • कार्यान्वयन-परिभाषित संकेत उठाया जाता है, संभवतः कार्यक्रम को समाप्त कर रहा है,
    • या जहां कुछ प्लेटफार्मों पर व्यवहार अपरिभाषित है sizeof (char) == sizeof (int)

सभी वेतन वृद्धि के संचालन c = c + 1, c += 1, c++और ++cएक ही मंच पर एक ही दुष्प्रभाव हो। अभिव्यक्ति का मूल्यांकन मूल्य वृद्धि c++से cपहले का मूल्य होगा ; अन्य तीन के लिए, यह cवेतन वृद्धि के बाद का मूल्य होगा ।


1
sizeof(int) == 1आवश्यकता होगी CHAR_BITS >= 16, है ना?
sepp2k

3
@ sepp2k <pedantic>IDK के बारे में CHAR_BITSलेकिन CHAR_BITहोगा >= 16</pedantic>
एंटटी हापाला

2
एक और कारण क्यों charहमेशा डिफ़ॉल्ट रूप से अहस्ताक्षरित होना चाहिए।
चकरली

1
@chqrlie मैं सहमत हूं, दुर्भाग्य से यह सिर्फ इतना हो सकता है कि यह डिफ़ॉल्ट रूप से हस्ताक्षरित था क्योंकि अहस्ताक्षरित इतिहास में बाद में था, अब कुछ क्रॉप प्रोग्रामों को बदलने के लिए बहुत कठिन हो सकता है क्योंकि टूटे हुए कार्यक्रमों की पर्याप्त मात्रा के कारण EOF में फिट होने की उम्मीद है चार ..
अंती हापाला

1
कभी-कभी एक प्रत्यक्ष उत्तर भी जोड़ना स्पष्ट होता है: "क्या CHAR_MAX के लिए एक मान का मूल्य CHAR_MIN के चारों ओर लपेटने की गारंटी है?" -> नहीं
चुक्स - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.