CHAR_BIT क्या है?


91

Http://graphics.stanford.edu/~seander/bithacks.html से शाखाओं के बिना पूर्णांक पूर्ण मान (एब्स) की गणना के लिए कोड उद्धृत करना :

int v;           // we want to find the absolute value of v
unsigned int r;  // the result goes here 
int const mask = v >> sizeof(int) * CHAR_BIT - 1;

r = (v + mask) ^ mask;

पेटेंट भिन्नता:

r = (v ^ mask) - mask;

क्या है CHAR_BITऔर इसका उपयोग कैसे किया जाता है?

जवाबों:


-2

आपको पता होना चाहिए कि यह कोड हस्ताक्षरित प्रकारों पर सही बिटशिफ्ट के कार्यान्वयन-परिभाषित व्यवहार पर निर्भर करता है। gcc हमेशा सेंस बिहेवियर (साइन-बिट-एक्सटेंशन) देने का वादा करता है, लेकिन ISO C कार्यान्वयन को ऊपरी बिट्स को शून्य-भरने की अनुमति देता है।

इस समस्या का एक तरीका:

#ifdef HAVE_SIGN_EXTENDING_BITSHIFT
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
#else
int const mask = -((unsigned)v >> sizeof(int) * CHAR_BIT - 1);
#endif

आपका Makefileया config.hआदि HAVE_SIGN_EXTENDING_BITSHIFTआपके प्लेटफॉर्म के आधार पर बिल्ड टाइम को परिभाषित कर सकता है।


120
मुझे समझ नहीं आता कि यह एक स्वीकृत उत्तर कैसे हो सकता है क्योंकि यह प्रश्न का उत्तर नहीं देता है, भले ही यह एक बहुत ही दिलचस्प टिप्पणी हो।
qdii

14
@ मौरिस: किसी ने प्रश्न को संपादित किया और एक उप-प्रश्न को प्रश्न शीर्षक में बढ़ावा दिया। मूल शीर्षक भयानक रूप से भयानक था, लेकिन ओपी का सवाल था कि उद्धृत बिट हैक कोड कैसे काम करता है, और "यह कम से कम, पोर्ट्रेट नहीं है, और यहां क्यों" एक उपयोगी उत्तर है।
R .. गिटहब स्टॉप हेल्पिंग ICE

12
आह! मुझे समझ आ गया। अफसोस की बात है, यह प्रश्न Google खोज परिणामों में "क्या है CHAR_BIT?" , भले ही वह मूल प्रश्न नहीं था। :( आपके स्पष्टीकरण को देखते हुए, मुझे समझ में आया कि आपने यह उत्तर क्यों लिखा है, लेकिन उत्तरजीविता के लिए यह या तो अधिक उपयोगी हो सकता है (क) अपने उत्तर को हटा दें और इसे प्रश्न के लिए एक टिप्पणी के रूप में फिर से लिखें, ताकि @ आरा के शीर्ष पर दिखाई दे, या (ख) अपने उत्तर को संपादित करें ताकि यह प्रश्न के वर्तमान शीर्षक का उत्तर दे।
लिन

1
ओपी के मूल प्रश्न और उसके संपादक की व्याख्या के बीच आशय के अंतर के कारण, ऐसा प्रतीत होता है जैसे मूल अनुरोध की प्रकृति को अनैच्छिक रूप से स्थानांतरित कर दिया गया था। जबकि दोनों प्रश्नों (मूल और संपादित) में योग्यता है, इस विसंगति को संबोधित करने की आवश्यकता है। अब मैं पूछताछ करता हूं: क्या इस उत्तर को विकि में जोड़ा जा सकता है? यह संभवतः उन लोगों की मदद करेगा जो इस प्रकार की जानकारी खोज रहे हैं, हालांकि यह मूल प्रश्न से संबंधित नहीं है। इस तरह के बाद, सवाल फिर से संपादित किया जा सकता है, डेटो डेटुशिविली के मूल अनुरोध को फिट करने के लिए। बस एक संबंधित पाठक ...

2
मैंने सिर्फ इस प्रश्न के इतिहास को देखा और मूल प्रश्न वास्तव में कहीं भी नहीं पूछता है कि कोड कैसे काम करता है। संपादक ने जिस सवाल को शीर्षक से प्रचारित किया, वह वहाँ का एकमात्र वास्तविक सवाल है।
प्लग

224

CHAR_BITबिट्स की संख्या में है char। इन दिनों, लगभग सभी आर्किटेक्चर प्रति बाइट में 8 बिट्स का उपयोग करते हैं लेकिन यह हमेशा ऐसा नहीं होता है। कुछ पुरानी मशीनों में 7-बिट बाइट हुआ करती थी।

इसमें पाया जा सकता है <limits.h>


3
कुछ डीएसपी में 10 या अधिक बिट-बाइट्स होते हैं।
जूरी रॉबल

63
सी को CHAR_BIT>=8डीएसपी के लिए बहुत बड़े मूल्यों की आवश्यकता होती है और अनुमति देता है जिसमें केवल एक ही प्रकार का आकार होता है, अक्सर 32 बिट। POSIX की आवश्यकता है CHAR_BIT==8। सामान्य तौर पर, आप किसी भी मल्टी-यूजर / मल्टीटास्किंग सर्वर-ओरिएंटेड या इंटरएक्टिव-यूज़-ओरिएंटेड आर्किटेक्चर को इंटरनेट से जुड़े होने या बाहरी दुनिया के साथ टेक्स्ट डेटा को इंटरचेंज करने के किसी भी अवसर के साथ ग्रहण कर सकते हैं CHAR_BIT==8
आर .. गिटहब स्टॉप हेल्पिंग ICE

6
@ कफ: नहीं, यह है कि C99 के प्रकार int8_tऔर uint8_tअस्तित्व की आवश्यकता है। इस प्रकार एक प्रकार की चौड़ाई मौजूद है। 8. चूंकि sizeofकिसी भी प्रकार को sizeof charवास्तव में संगत sizeof int8_tहोना चाहिए 1. इसलिए CHAR_BIT == 8। मैंने उस आज्ञापत्र के आसपास कुछ लिखा है: gustedt.wordpress.com/2010/06/01/how-many-bits-has-a-byte
जेन्स गुस्तेद

22
@ जेंस गुस्टेड: कृपया C99 स्पेक में एक सेक्शन का हवाला दें। सटीक-चौड़ाई पूर्णांक प्रकारों में से, C99 कल्पना कहती है "ये प्रकार वैकल्पिक हैं।" (7.18.1.1/3) न्यूनतम-चौड़ाई और सबसे तेज़-चौड़ाई प्रकार की आवश्यकता होती है, हालाँकि।
jamesdlin

3
@ जेम्सडेलिन और कैफे: माफ करना, मैंने चीजों को मिलाया। हाँ, मैं वास्तव में POSIX से आता है के लिए संदर्भित आवश्यकता stdint.h। तो वहाँ यह आवश्यक है, और यह उस मानक के एक विशेष संस्करण का जिक्र किए बिना, आईएसओ सी मानक के विस्तार के रूप में भी चिह्नित है । मेरी गलती।
जेन्स गुस्तेद

2

मूल प्रश्न में स्पष्ट प्रश्न (CHAR_BIT क्या है) और अंतर्निहित प्रश्न (यह काम कैसे करता है) दोनों का उत्तर देने की कोशिश की जा रही है।


C और C ++ में एक चार्ट स्मृति की सबसे छोटी इकाई का प्रतिनिधित्व करता है जिसे C प्रोग्राम संबोधित कर सकता है *

C और C ++ में CHAR_BIT एक चार्ट में बिट्स की संख्या का प्रतिनिधित्व करता है। चार्ट प्रकार पर अन्य आवश्यकताओं के कारण इसे हमेशा कम से कम 8 होना चाहिए। सभी आधुनिक सामान्य प्रयोजन के कंप्यूटरों पर व्यवहार में यह ठीक 8 है, लेकिन कुछ ऐतिहासिक या विशेषज्ञ प्रणालियों में उच्च मूल्य हो सकते हैं।

Java में CHAR_BIT या sizeof का कोई समतुल्य नहीं है, इसकी कोई आवश्यकता नहीं है क्योंकि Java में सभी आदिम प्रकार निश्चित आकार के हैं और ऑब्जेक्ट की आंतरिक संरचना प्रोग्रामर के लिए अपारदर्शी है। यदि इस कोड का जावा में अनुवाद किया जाए तो आप निश्चित मूल्य 31 के द्वारा "sizeof (int) * CHAR_BIT - 1" को बदल सकते हैं।

इस विशेष कोड में इसका उपयोग एक इंट में बिट्स की संख्या की गणना करने के लिए किया जा रहा है। विदित हो कि यह गणना मानती है कि इंट प्रकार में कोई पेडिंग बिट्स नहीं है।

यह मानते हुए कि आपका संकलक हस्ताक्षरित संख्याओं की बिट शिफ्ट पर विस्तार करना चुनता है और यह मानकर कि आपका सिस्टम नकारात्मक संख्याओं के लिए 2s पूरक प्रतिनिधित्व का उपयोग करता है, इसका मतलब है कि "MASK" सकारात्मक या शून्य मान के लिए 0 और नकारात्मक मान के लिए -1 होगा।

एक टोमस पूरक संख्या को नकारने के लिए हमें एक बिटवाइज़ प्रदर्शन करने की आवश्यकता होती है और फिर एक को जोड़ने की। समान रूप से हम एक को घटा सकते हैं और फिर बिटवाइज इसे नकार सकते हैं।

फिर से मान लेते हैं कि टोट्स सप्लीमेंट प्रतिनिधित्व -1 सभी लोगों द्वारा दर्शाया गया है, इसलिए अनन्य या -1 के साथ बिटवाइज निषेध के बराबर है।

तो जब v शून्य है तो संख्या अकेले रह जाती है, जब v एक होता है तो इसे नकार दिया जाता है।

कुछ के बारे में पता है कि C और C ++ में हस्ताक्षरित अतिप्रवाह अपरिभाषित व्यवहार है। इसलिए सबसे नकारात्मक मूल्य पर इस एबीएस कार्यान्वयन का उपयोग करने से अपरिभाषित व्यवहार होता है। इस तरह के कलाकारों को जोड़कर तय किया जा सकता है कि कार्यक्रम की अंतिम पंक्ति का मूल्यांकन अहस्ताक्षरित इंट में किया गया है।

* जो आमतौर पर होता है लेकिन nesacerally स्मृति की सबसे छोटी इकाई के समान नहीं है जिसे हार्डवेयर संबोधित कर सकता है। एक कार्यान्वयन संभावित रूप से प्रोग्राम-एड्रेसेबल मेमोरी की एक इकाई में हार्डवेयर-एड्रेसेबल मेमोरी की कई इकाइयों को जोड़ सकता है या प्रोग्राम-एडरेसेबल मेमोरी की कई यूनिटों में हार्डवेयर एड्रेस करने योग्य मेमोरी की एक यूनिट को विभाजित कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.