2012-09-30 29 views
13

this answer और संलग्न टिप्पणियां, Pavel Minaev निम्न तर्क देता है कि, सी में, केवल uint8_t टाइप किए गए प्रकार टाइप किए जा सकते हैं char और unsigned char। मैं सी मानक के this draft पर देख रहा हूं।क्या uint8_t गैर-वर्ण प्रकार हो सकता है?

  • uint8_t की उपस्थिति एक इसी प्रकार int8_t (7.18.1p1) की उपस्थिति का तात्पर्य।
  • int8_t 8 बिट चौड़ा है और इसमें कोई पैडिंग बिट्स नहीं है (7.18.1.1p1)।
  • अनुरूप प्रकारों की एक ही चौड़ाई (6.2.5 पी 6) है, इसलिए uint8_t भी 8 बिट चौड़ा है।
  • unsigned charCHAR_BIT बिट्स चौड़ा (5.2.4.2.1p2 और 6.2.6.1p3) है।
  • CHAR_BIT कम से कम 8 (5.2.4.2.1p1) है। क्योंकि या तो uint8_tunsigned char है, या यह एक गैर unsigned char, गैर बिट फ़ील्ड प्रकार जिसका चौड़ाई CHAR_BIT (6.2.6.1p4) की एक बहु है
  • CHAR_BIT, अधिक से अधिक 8 है।

इस तर्क के आधार पर, मैं मानता हूँ कि, अगर uint8_t मौजूद है, तो दोनों यह और unsigned char समान निरूपण है: 8 मूल्य बिट्स और 0 गद्दी बिट्स। ऐसा लगता है कि उन्हें एक ही प्रकार (उदाहरण के लिए, 6.2.5 पी 14) होने के लिए मजबूर नहीं किया जाता है।

यह अनुमति दी है कि uint8_tunsigned char के रूप में ही प्रतिनिधित्व के साथ एक विस्तारित अहस्ताक्षरित पूर्णांक प्रकार (6.2.5p6) को typedef'd है? निश्चित रूप से इसे टाइप किया जाना चाहिए (7.18.1.1p2), और यह unsigned char (या char के अलावा किसी भी मानक हस्ताक्षरित पूर्णांक प्रकार नहीं हो सकता है अगर यह हस्ताक्षरित होता है)। यह काल्पनिक विस्तारित प्रकार एक वर्ण प्रकार (6.2.5 पी 15) नहीं होगा और इस प्रकार एक असंगत प्रकार (6.5 पी 7) की किसी ऑब्जेक्ट पर एलियाड एक्सेस के लिए अर्हता प्राप्त नहीं होगा, जो मुझे संकलित करता है क्योंकि एक कंपाइलर लेखक ऐसा करना चाहता है चीज़।

+0

नहीं आपकी स्पष्ट प्रश्न का उत्तर है, लेकिन यह संभव है कि 'चार: यह मंच पर निर्भर है कि क्या है 'एक हस्ताक्षरित प्रकार है, फिर' uint8_t' को 'char' के बजाय 'char'' टाइप किया जा सकता है nsigned char'। –

+0

एक बिंदु पर (कई साल पहले) जीसीसी परियोजना के भीतर एक विस्तृत पूर्णांक प्रकार जोड़ने की गंभीर चर्चा थी जिसमें आप वर्णित गुणों के साथ --- आठ बिट्स चौड़े, चरित्र प्रकार नहीं, और प्रकार में एक विशेष मामला नहीं है आधारित उपनाम विश्लेषण --- लेकिन जहां तक ​​मुझे पता है कि यह कभी भी कहीं नहीं गया था, और 'uint8_t' के लिए अंतर्निहित प्रकार होने का कोई सुझाव नहीं था (संभवतः सिर्फ इसलिए कि उस समय किसी ने इसके बारे में सोचा नहीं था)। – zwol

+0

ध्यान दें कि 'uint8_t' बिल्कुल मौजूद नहीं है। यह केवल सशर्त रूप से परिभाषित है। –

उत्तर

-1

int8_t और uint8_t केवल प्रतिनिधित्व द्वारा भिन्न है और सामग्री (बिट्स) नहीं। int8_t डेटा के लिए कम 7 बिट्स का उपयोग करता है और 8 वां बिट "साइन" (सकारात्मक या नकारात्मक) का प्रतिनिधित्व करना है। इसलिए int8_t की सीमा -128 से +127 (0 को सकारात्मक मान माना जाता है) से है।

uint8_t भी 8 बिट चौड़ा है, लेकिन इसमें मौजूद डेटा हमेशा सकारात्मक है। इसलिए uint8_t की सीमा 0 से 255 है।

इस तथ्य को ध्यान में रखते हुए, चार 8 बिट चौड़ा है। हस्ताक्षर किए गए चार भी 8 बिट चौड़े होंगे लेकिन "साइन" के बिना। इसी प्रकार छोटे और हस्ताक्षरित छोटे दोनों 16 बिट चौड़े हैं।

हालांकि, "unsigned int" 8 बिट चौड़े हो, तो .. चूंकि सी भी प्रकार-नाज़ी नहीं है, इसकी अनुमति है। और एक कंपाइलर लेखक ऐसी चीज क्यों अनुमति देगा? पठनीयता!

+1

विनिर्देशों के अनुसार 'हस्ताक्षरित int' की चौड़ाई 16 से कम नहीं है – user1710520

+0

। लेकिन हम इसे देख रहे हैं हम नहीं हैं? –

+1

Hypothetically, लेकिन मानक अनुरूप। –

4

तो uint8_t मौजूद है, कोई गद्दी आवश्यकता का तात्पर्य है कि CHAR_BIT 8. हालांकि है, वहाँ कोई मौलिक कारण है कि uint8_t एक विस्तारित पूर्णांक प्रकार साथ परिभाषित नहीं किया जा सकता है मैं मिल सकता है। इसके अलावा कोई गारंटी नहीं है कि प्रतिनिधित्व समान हैं; उदाहरण के लिए, बिट्स को विपरीत क्रम में व्याख्या किया जा सकता है।

हालांकि यह uint8_t के लिए मूर्ख और अनावश्यक रूप से असामान्य लगता है, यह int8_t के लिए बहुत अधिक समझ सकता है। यदि कोई मशीन मूल रूप से पूरक या साइन/परिमाण का उपयोग करती है, तो signed charint8_t के लिए उपयुक्त नहीं है। हालांकि, यह एक विस्तारित हस्ताक्षरित पूर्णांक प्रकार का उपयोग कर सकता है जो int8_t प्रदान करने के लिए जुड़वां पूरक का अनुकरण करता है।

+0

"उदाहरण के लिए, बिट्स को विपरीत क्रम में व्याख्या किया जा सकता है"। क्या इसका मतलब यह है कि बिट्स को 'हस्ताक्षरित चार' बनाम (प्रत्येक व्यक्तिगत बाइट) के बिना हस्ताक्षरित int' में विपरीत क्रम में व्याख्या किया जा सकता है? या यह केवल विस्तारित पूर्णांक प्रकार है जो डेटा बस को पार कर सकता है ;-) –

+0

@SteveJessop: 'unsigned int' आमतौर पर एन बाइट्स (जहां एन आमतौर पर 4 होता है) या तो छोटे एंडियन या बड़े एंडियन ऑर्डर में व्याख्या किया जाता है, लेकिन मानक बाइट्स या यहां तक ​​कि बिट्स के आदेश के बारे में कुछ भी नहीं कहता है। मुझे यकीन नहीं है कि आपका "क्रॉस-वायर डेटा बस" प्रश्न गंभीर था, लेकिन कोई कारण नहीं है कि '* (हस्ताक्षरित चार *) और (uint8_t) {1}' होना चाहिए और दो की कुछ अन्य शक्ति नहीं है । ("शुद्ध बाइनरी" आवश्यकता का मतलब है कि यह * कुछ * शक्ति है, हालांकि।) –

+1

मुझे गंभीरता से यह मतलब नहीं था कि यह बस शारीरिक रूप से क्रॉस-वायरिंग द्वारा हासिल की जाएगी, लेकिन इसके अलावा सवाल गंभीर था। यह सिर्फ मुझे नहीं लगता कि मैंने कभी भी 'हस्ताक्षरित int = 1; के लिए (हस्ताक्षरित char * p = (unsigned char *) और a; p <(unsigned char *) (&a+1); ++ p) अगर (* p == 1) वापसी; 'वापस लौटने की आवश्यकता नहीं है। इसी तरह, मुझे लगता है कि कुछ मूर्खतापूर्ण है' unsigned int a = 0xF; strlen ((char *) &a); 'एक संभावित बफर ओवररन प्रदान किया गया है 'sizeof (a)> = 4' (4 मान में सेट बिट्स की संख्या होने के कारण), जब तक मानक कहता है कि बाइट्स ऑब्जेक्ट repr। * संगत * मूल्य बिट्स हैं। –

2

6.3.1.1 में (1) (सी 11 मानक के N1570 ड्राफ्ट के), हम

पढ़ सकते हैं किसी भी मानक पूर्णांक प्रकार के पद किसी भी विस्तारित पूर्णांक प्रकार के रैंक के साथ की तुलना में अधिक हो जाएगा एक ही चौड़ाई।

तो मानक स्पष्ट रूप से मानक पूर्णांक प्रकार के समान चौड़ाई के विस्तारित पूर्णांक प्रकारों की उपस्थिति की अनुमति देता है।

मानक में कुछ भी नहीं करता है, तो उस विस्तारित पूर्णांक प्रकार uint8_t के लिए विनिर्देशों (कोई गद्दी बिट्स, 8 बिट की चौड़ाई) से मेल खाता है एक

typedef implementation_defined_extended_8_bit-unsigned_integer_type uint8_t; 

पर रोक लगाने, के रूप में जहाँ तक मैं देख सकता है।

तो हाँ, अगर कार्यान्वयन इस तरह के एक विस्तारित पूर्णांक प्रकार, प्रदान करता है uint8_t कि करने के लिए typedef'ed जा सकता है।

0

uint8_t मौजूद हो सकता है और unsigned char से एक अलग प्रकार का हो सकता है।

इसका एक महत्वपूर्ण प्रभाव ओवरलोड रिज़ॉल्यूशन में है;

uint8_t by = 0; 
std::cout << by; 

का उपयोग करता

  1. operator<<(ostream, char)
  2. operator<<(ostream, unsigned char) या
  3. operator<<(ostream, int)
+0

यह एक सी प्रश्न है। आपको अपने दावे का बैक अप लेने के लिए ओपी उद्धृत सभी चीजों के लिए सी ++ संदर्भ प्रदान करना होगा –

+0

क्या आपका कहना है कि "uint8_t' मौजूद हो सकता है और 'char' और' unsigned char 'दोनों से एक अलग प्रकार का हो सकता है? या आप केवल दावा कर रहे हैं कि यह मामला के कारण' हस्ताक्षरित चार 'से अलग हो सकता है यह 'चार' है? इसके अलावा, मैं इसे देजा वी क्यों लिख रहा हूं –

संबंधित मुद्दे