C में पूर्णांक प्रकारों के बारे में पूरी सच्चाई

सबसे पहले, कुछ सवाल:

  1. चरित्र के लिए char प्रकार डिफ़ॉल्ट है या नहीं? int बारे में क्या?
  2. क्या निहित कास्टिंग (signed char *) से (char *) ? और वही int ?
  3. unsigned char में कितने बिट्स हैं?
  4. int में रखे जाने की अधिकतम संख्या क्या है? और न्यूनतम?
  5. long प्रकार निश्चित रूप से char से बड़ा है, है ना?

बेशक, प्रयोगात्मक रूप से अपने पसंदीदा कंप्यूटर पर अपने पसंदीदा सिस्टम 1 में अपने पसंदीदा संकलक का उपयोग करके इन सवालों के जवाब की तलाश करना ) एक अच्छा विचार नहीं है। हम एक भाषा मानक (C99 और नए) के बारे में बात कर रहे हैं।

यदि आप आत्मविश्वास से इन प्रश्नों का सही उत्तर दे सकते हैं, तो यह लेख आपके लिए नहीं है। अन्यथा, इसे पढ़ने के लिए खर्च किए गए दस मिनट बहुत उपयोगी होंगे।

मैं मान लूंगा कि आपने उत्तर दिया
  1. दोनों महत्वपूर्ण।
  2. दोनों कानूनी हैं।
  3. 8।
  4. 2147483647. -214748364 8
  5. बेशक, कैप।


और सही उत्तर हैं
  1. char - विनियमित नहीं, int - हस्ताक्षरित।
  2. उदाहरण के लिए, यह कानूनी है, लेकिन char , नहीं।
  3. कम से कम 8।
  4. 32767. -3276 7
  5. सामान्यतया, नहीं।




signed और unsigned बारे में


char छोड़कर सभी पूर्णांक प्रकार डिफ़ॉल्ट रूप से, हस्ताक्षरित हैं।

char साथ char स्थिति अधिक जटिल है। मानक तीन अलग-अलग प्रकारों की स्थापना करता है: char , signed char , unsigned char । विशेष रूप से, प्रकार का एक संकेतक (signed char *) को स्पष्ट रूप से टाइप (char *) नहीं डाला जा सकता है।

यद्यपि औपचारिक रूप से ये तीन अलग-अलग प्रकार हैं, वास्तव में char या तो signed char या unsigned char बराबर हैं - संकलक की पसंद (मानक को कुछ विशिष्ट की आवश्यकता नहीं है)।

मैंने टिप्पणियों में char बारे में अधिक विवरण लिखा है।

unsigned char आकार के बारे में


unsigned char प्रकार मशीन बाइट का एक अमूर्तन है। इस प्रकार का महत्व यह है कि C केवल निकटतम बाइट को मेमोरी को संबोधित कर सकता है। अधिकांश आर्किटेक्चर पर, बाइट का आकार 8 बिट्स है, लेकिन अपवाद हैं। उदाहरण के लिए, 36-बिट आर्किटेक्चर वाले प्रोसेसर में आमतौर पर 9-बिट बाइट्स होते हैं, और टेक्सास इंस्ट्रूमेंट्स डीएसपी में कुछ बाइट्स में 16 या 32 बिट्स होते हैं। प्राचीन वास्तुकला में 4, 5 या 7 बिट्स के छोटे बाइट्स हो सकते हैं।

स्टैंडर्ड सी को एंटीडिल्वियन आर्किटेक्चर को छोड़ने के लिए मजबूर किया जाता है और यह आवश्यक है कि बाइट्स कम से कम 8-बिट हों। इस प्लेटफ़ॉर्म के लिए विशिष्ट मान ( CHAR_BIT 2) हेडर फ़ाइल limits.h में दर्ज किया गया है।

C में पूर्णांक प्रकार के आकार


सी पोर्टेबल है, इसलिए इसमें मूल पूर्णांक प्रकार ( char , short , int , आदि) एक सख्त सेट आकार नहीं है, लेकिन प्लेटफ़ॉर्म पर निर्भर करता है। हालाँकि, ये प्रकार पोर्टेबल नहीं होंगे यदि
उनके आकार पूरी तरह से मनमाने थे: मानक सभी मूल पूर्णांक प्रकारों के लिए स्वीकृत मानों की न्यूनतम सीमा स्थापित करता है। अर्थात्,


मानक के लिए यह आवश्यक है कि unsigned char का अधिकतम मूल्य 2 CHAR_BIT maximum1 (पिछले पैराग्राफ देखें)।

मानक के लिए sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) । इस प्रकार, प्रकार के sizeof(char)=sizeof(long)=32 प्रकार की परिस्थितियां काफी वैध हैं। टेक्सास इंस्ट्रूमेंट्स से कुछ डीएसपी के लिए यह है।

इस प्लेटफ़ॉर्म के लिए इन श्रेणियों के विशिष्ट मान हेडर फ़ाइल limits.h में निर्दिष्ट हैं।

C99 में नए प्रकार


C99 द्वारा long long प्रकार को जोड़ने के बाद, पूर्णांक प्रकार और भ्रम और भी अधिक हो गए। चीजों को क्रम में रखने के लिए, मानक ने हेडर फ़ाइल stdint.h शुरुआत की, जो int16_t (16 बिट्स के बराबर), int_least16_t (न्यूनतम प्रकार जो 16 बिट्स को समायोजित कर सकता है), int_fast16_t (कम से कम 16 बिट्स) को int_fast16_t , इस प्रकार के साथ काम करना इस पर सबसे तेज़ है। मंच), आदि

कम से कम- और तेज-प्रकार वास्तव में ऊपर चर्चा किए गए int , short , long , आदि प्रकारों के लिए एक प्रतिस्थापन है, केवल इसके अलावा प्रोग्रामर को गति और आकार के बीच विकल्प देते हैं।

int16_t जैसे प्रकार, एक सख्त आकार संकेत के साथ, पोर्टेबिलिटी ग्रस्त हैं: कहते हैं, एक आर्किटेक्चर पर 9-बिट बाइट के साथ, 16-बिट रजिस्टर बस नहीं मिल सकता है। इसलिए, यहां मानक स्पष्ट रूप से कहता है कि ये प्रकार वैकल्पिक हैं। लेकिन यह देखते हुए कि कोई भी कोड जो आप लिखते हैं, सभी मामलों में कम से कम लक्ष्य वास्तुकला सबसे खराब स्थिति में भी तय की जाती है, परिवार के लिए सटीक (जैसे, x86 या AVR), जिसके अंदर बाइट का आकार अचानक नहीं बदल सकता है, तो पोर्टेबिलिटी वास्तव में संरक्षित है । इसके अलावा, int16_t जैसे प्रकार int_least16_t और int_fast16_t तुलना में और भी अधिक लोकप्रिय हो int_least16_t , और यहां तक ​​कि निम्न-स्तरीय प्रोग्रामिंग (माइक्रोकंट्रोलर, डिवाइस ड्राइवर) के साथ, क्योंकि अक्सर चर आकार की अनिश्चितता बस अनुमेय नहीं होती है।



1) सुविधा के लिए, शीर्ष तीन वास्तुकला + OS + संकलक को केवल एक मंच कहा जाएगा।
2) यह मैक्रो UCHAR_BIT को कॉल करने के लिए UCHAR_BIT सही होगा, लेकिन संगतता कारणों से इसे कहा जाता है।

Source: https://habr.com/ru/post/In156593/


All Articles