c++ एक हस्ताक्षरित चार क्या है?




char (14)

सी / सी ++ में, किस unsigned char का उपयोग किया जाता है? यह एक नियमित char से अलग कैसे है?


यदि आप विभिन्न प्रकार की विशिष्ट लंबाई और हस्ताक्षर का उपयोग करना पसंद करते हैं, तो आप शायद uint8_t, int8_t, uint16_t, आदि के साथ बेहतर हो सकते हैं क्योंकि वे वही करते हैं जो वे कहते हैं।


हस्ताक्षरित संख्या always positive or zero , और laws of arithmetic modulo 2^n के laws of arithmetic modulo 2^n पालन ​​करती laws of arithmetic modulo 2^n , जहां n प्रकार में बिट्स की संख्या है

उदाहरण : यदि वर्ण 8 बिट्स हैं , तो unsigned char चर के पास 0 and 255 बीच मान हैं, जबकि signed chars में -128 and 127. बीच मान हैं -128 and 127.


यदि आप एक चरित्र को छोटे पूर्णांक के रूप में उपयोग करना चाहते हैं, तो इसे करने का सबसे सुरक्षित तरीका int8_t और uint8_t प्रकारों के साथ है।


प्रत्यक्ष मूल्यों के संदर्भ में नियमित रूप से CHAR_MIN का उपयोग तब किया जाता है जब मान CHAR_MIN और CHAR_MAX बीच CHAR_MIN CHAR_MAX जबकि एक हस्ताक्षरित चार सकारात्मक अंतराल पर सीमा को दोगुना करता है। उदाहरण के लिए, यदि CHAR_BIT 8 है, तो नियमित char की सीमा केवल [0, 127] होने की गारंटी है (क्योंकि इसे हस्ताक्षरित या हस्ताक्षरित किया जा सकता है) जबकि unsigned char [0, 255] होगा और signed char होगा [-127 , 127]।

इसके लिए उपयोग किए जाने के संदर्भ में, मानक पीओडी (सादे पुराने डेटा) की वस्तुओं को सीधे हस्ताक्षरित चार की सरणी में परिवर्तित करने की अनुमति देते हैं। यह आपको वस्तु के प्रतिनिधित्व और बिट पैटर्न की जांच करने की अनुमति देता है। सुरक्षित प्रकार की दंड की एक ही गारंटी चार या हस्ताक्षरित चार के लिए मौजूद नहीं है।


क्योंकि मुझे लगता है कि इसे वास्तव में बुलाया जाता है, मैं सिर्फ सी और सी ++ के कुछ नियमों को बताना चाहता हूं (वे इस संबंध में समान हैं)। सबसे पहले, किसी भी हस्ताक्षरित चार ऑब्जेक्ट को मान निर्धारित करने में unsigned char सभी बिट्स मूल्य निर्धारित करने में भाग लेते हैं। दूसरा, unsigned char स्पष्ट रूप से हस्ताक्षरित कहा गया है।

अब, मैंने किसी के साथ चर्चा की थी कि जब आप मान -1 प्रकार के int को unsigned char परिवर्तित करते हैं तो क्या होता है। उन्होंने इस विचार से इंकार कर दिया कि परिणामस्वरूप unsigned char उसकी सभी बिट्स 1 पर सेट की गई हैं, क्योंकि वह साइन प्रतिनिधित्व के बारे में चिंतित थे। लेकिन उसे नहीं करना है। यह तुरंत इस नियम से बाहर है कि रूपांतरण का उद्देश्य क्या है:

यदि नया प्रकार हस्ताक्षरित है, तो मूल्य को अधिकतम प्रकार से अधिक जोड़कर बार-बार जोड़कर घटाया जा सकता है जिसे नए प्रकार में प्रदर्शित किया जा सकता है जब तक कि मान नए प्रकार की सीमा में न हो। (सी 99 मसौदे में 6.3.1.3p2 )

यह एक गणितीय विवरण है। सी ++ मॉड्यूल कैलकुस के संदर्भ में इसका वर्णन करता है, जो एक ही नियम को उत्पन्न करता है। वैसे भी, गारंटी नहीं है कि पूर्णांक -1 में सभी बिट रूपांतरण से पहले एक हैं। तो, हमारे पास क्या है ताकि हम दावा कर सकें कि परिणामस्वरूप unsigned char में इसकी सभी CHAR_BIT बिट्स 1 हो गई हैं?

  1. सभी बिट्स इसके मूल्य को निर्धारित करने में भाग लेते हैं - यानी, वस्तु में कोई पैडिंग बिट नहीं होता है।
  2. केवल एक बार UCHAR_MAX+1 से -1 जोड़ना श्रेणी में एक मान उत्पन्न करेगा, अर्थात् UCHAR_MAX

यह वास्तव में पर्याप्त है! तो जब भी आप एक unsigned char को अपने सभी बिट्स रखना चाहते हैं, तो आप करते हैं

unsigned char c = (unsigned char)-1;

यह भी इस प्रकार है कि एक रूपांतरण उच्च आदेश बिट्स को कम नहीं कर रहा है। दो के पूरक के लिए भाग्यशाली घटना यह है कि यह सिर्फ एक छेड़छाड़ है, लेकिन यह अन्य संकेत प्रस्तुतिकरणों के लिए भी जरूरी नहीं है।


यह कार्यान्वयन निर्भर है, क्योंकि सी मानक char के हस्ताक्षरित-नेस को परिभाषित नहीं करता है। प्लेटफॉर्म के आधार पर, चार को signed या signed किया जा सकता है, इसलिए यदि आपका कार्यान्वयन इस पर निर्भर करता है तो आपको स्पष्ट रूप से signed char या signed char लिए पूछना होगा। यदि आप तारों से वर्णों का प्रतिनिधित्व करना चाहते हैं तो बस char उपयोग करें, क्योंकि यह आपके प्लेटफॉर्म को स्ट्रिंग में रखेगा इससे मेल खाएगा।

signed char और signed char बीच का अंतर जैसा आप चाहते हैं। अधिकांश प्लेटफॉर्म पर, signed char -128 से 127 तक के 8-बिट दो की पूरक संख्या होगी, और unsigned char 8-बिट हस्ताक्षरित पूर्णांक ( 0 से 255 ) होगा। ध्यान दें कि मानक की आवश्यकता नहीं है कि char प्रकारों में 8 बिट्स हों, केवल उस sizeof(char) वापसी 1 । आप CHAR_BIT साथ char में बिट्स की संख्या CHAR_BIT में प्राप्त कर सकते हैं। अगर कुछ प्लेटफॉर्म आज हैं तो यह कुछ है, हालांकि यह 8 से कुछ और होगा।

यहां इस मुद्दे का एक अच्छा सारांश here

चूंकि मैंने इसे पोस्ट करने के बाद दूसरों का उल्लेख किया है, तो आप int8_t और uint8_t का उपयोग करना बेहतर कर सकते हैं यदि आप वास्तव में छोटे पूर्णांक का प्रतिनिधित्व करना चाहते हैं।


unsigned char केवल सकारात्मक मूल्य लेता है .... जैसे 0 से 255

जहाँ तक

signed char सकारात्मक और नकारात्मक दोनों मूल्यों को लेता है .... -128 से +127 तक


हस्ताक्षर किए गए चार सभी छोटी सी चाल का दिल है। सभी प्लेटफार्मों के लिए लगभग सभी कंपाइलर में एक हस्ताक्षरित चार बस एक BYTE है। (आमतौर पर) 8 बिट्स का एक हस्ताक्षरित पूर्णांक। जिसे एक छोटे पूर्णांक या बिट्स के पैक के रूप में माना जा सकता है।

व्यसन में, जैसा कि किसी और ने कहा है, मानक एक char के संकेत को परिभाषित नहीं करता है। इसलिए आपके पास 3 विशिष्ट "चार" प्रकार हैं: चार, हस्ताक्षरित चार, हस्ताक्षरित चार।


हस्ताक्षरित चार केवल सकारात्मक मान लेता है: 0 से 255 हस्ताक्षरित चार सकारात्मक और नकारात्मक मान लेते हैं: -128 से +127


सी ++ में, तीन अलग-अलग चरित्र प्रकार होते हैं:

  • char
  • signed char
  • unsigned char

यदि आप पाठ के लिए चरित्र प्रकार का उपयोग कर रहे हैं, तो अयोग्य char उपयोग करें:

  • यह 'a' या '0' जैसे चरित्र अक्षर का प्रकार है।
  • यह वह प्रकार है जो सी स्ट्रिंग्स को "abcde" बनाता है

यह एक संख्या मान के रूप में भी काम करता है, लेकिन यह निर्दिष्ट नहीं है कि क्या मान को हस्ताक्षरित या हस्ताक्षरित माना जाता है। असमानताओं के माध्यम से चरित्र तुलना से सावधान रहें - हालांकि यदि आप स्वयं को ASCII (0-127) तक सीमित करते हैं तो आप बस सुरक्षित हैं।

यदि आप चरित्र प्रकारों को संख्याओं के रूप में उपयोग कर रहे हैं, तो इसका उपयोग करें:

  • signed char , जो आपको कम से कम -127 से 127 रेंज देता है। (-128 से 127 आम है)
  • unsigned char , जो आपको कम से कम 0 से 255 रेंज देता है।

"कम से कम", क्योंकि सी ++ मानक केवल मानों की न्यूनतम सीमा देता है जो प्रत्येक संख्यात्मक प्रकार को कवर करने की आवश्यकता होती है। sizeof (char) 1 होना चाहिए (यानी एक बाइट), लेकिन सिद्धांत में एक बाइट उदाहरण के लिए 32 बिट्स हो सकता है। sizeof अभी भी इसके आकार को 1 रूप में रिपोर्ट करेगा - जिसका अर्थ है कि आप sizeof (char) == sizeof (long) == 1


signed char की श्रेणी है -128 से 127; unsigned char की सीमा 0 से 255 है।

char कंपाइलर के आधार पर हस्ताक्षरित चार या हस्ताक्षरित चार के बराबर होगा, लेकिन यह एक विशिष्ट प्रकार है।

यदि आप सी-स्टाइल स्ट्रिंग का उपयोग कर रहे हैं, तो बस char उपयोग करें। यदि आपको अंकगणितीय (बहुत दुर्लभ) के लिए वर्णों का उपयोग करने की आवश्यकता है, तो पोर्टेबिलिटी के लिए स्पष्ट रूप से हस्ताक्षरित या हस्ताक्षरित निर्दिष्ट करें।


उद्धृत "सी प्रोग्रामिंग लॉजेज" पुस्तक:

signed या signed योग्यता को चार या किसी भी पूर्णांक पर लागू किया जा सकता है। हस्ताक्षरित संख्या हमेशा सकारात्मक या शून्य होती हैं, और अंकगणित मॉड्यूलो 2 ^ एन के नियमों का पालन करती हैं, जहां एन प्रकार में बिट्स की संख्या है। इसलिए, उदाहरण के लिए, यदि वर्ण 8 बिट हैं, तो हस्ताक्षरित चार चर के पास 0 और 255 के बीच मान हैं, जबकि हस्ताक्षरित वर्णों में -128 और 127 (दो की पूरक मशीन में) के बीच मान हैं। क्या सादे वर्ण हस्ताक्षरित हैं या हस्ताक्षरित हैं मशीन पर निर्भर, लेकिन प्रिंट करने योग्य पात्र हमेशा सकारात्मक होते हैं।


कुछ googling this पाया, जहां लोगों के बारे में एक चर्चा थी।

एक हस्ताक्षरित चार मूल रूप से एक बाइट है। इसलिए, यदि आप डेटा के एक बाइट की आवश्यकता रखते हैं तो आप इसका उपयोग करेंगे (उदाहरण के लिए, हो सकता है कि आप इसे फ़ंक्शन पर पास होने के लिए फ्लैग चालू और बंद सेट करने के लिए उपयोग करना चाहते हैं, जैसा अक्सर विंडोज एपीआई में किया जाता है)।


एक हस्ताक्षरित चार एक (हस्ताक्षरित) बाइट मान (0 से 255) है। आप "चरित्र" होने के संदर्भ में "चार" के बारे में सोच रहे हैं लेकिन यह वास्तव में एक संख्यात्मक मूल्य है। नियमित "char" हस्ताक्षरित है, इसलिए आपके पास 128 मान हैं, और ये मान ASCII एन्कोडिंग का उपयोग कर वर्णों के लिए मानचित्र हैं। लेकिन किसी भी मामले में, आप स्मृति में जो भंडारण कर रहे हैं वह बाइट वैल्यू है।





char