2010-07-27 11 views
5

प्रकार int के वेरिएबल्स कथित रूप से "एक मशीन-प्रकार शब्द लंबाई में हैं" लेकिन एम्बेडेड सिस्टम में, 8 बिट माइक्रो उपयोग के लिए सी कंपाइलर्स 16 बिट्स के इंट के लिए !, (बिना हस्ताक्षर किए गए चार के लिए 8 बिट) तो अधिक बिट्स के लिए, int सामान्य रूप से व्यवहार करते हैं: 16 बिट माइक्रोस्कोस int में 16 बिट्स भी है, और 32 बिट माइक्रोस्कोस में 32 बिट्स इत्यादि हैं।हार्डवेयर की बिट चौड़ाई का पता लगाने के लिए कोई मानक तरीका है?

तो, क्या इसका परीक्षण करने का एक स्टैंडदर्शी तरीका है, BITSIZEOF (int) के रूप में कुछ?

जैसे "आकार" बाइट्स के लिए है लेकिन बिट्स के लिए है।

इस

मेरा पहला विचार

register c=1;     
    int bitwidth=0; 
    do 
    { 

     bitwidth++; 

    }while(c<<=1); 

    printf("Register bit width is : %d",bitwidth); 

था लेकिन यह पूर्णांक के रूप में सी लेता है, और यह, पूर्णांक के रूप में 16 बिट का उपयोग करने के 8 बिट compilers में आम है, इसलिए इसमें मेरे 16 परिणाम के रूप में देता है, ऐसा लगता है कोई "int" के रूप में "int" के लिए स्टैंडर, (या इसका सम्मान नहीं किया जाता है)

मैं इसे क्यों ढूंढना चाहता हूं? मान लीजिए मुझे कई चरों की आवश्यकता है जिन्हें 256 से कम मूल्यों की आवश्यकता है, इसलिए वे 8, 16, 32 बिट्स हो सकते हैं, लेकिन सही आकार (स्मृति और रजिस्टरों के समान) का उपयोग करके चीजों को तेज़ी से बढ़ाया जाएगा और स्मृति को बचाया जाएगा, और यदि यह नहीं हो सकता है कोड में फैसला किया, मैं हर वास्तुकला के लिए समारोह को फिर से लिखने की

संपादित उत्तर पढ़ के बाद मैं इस अच्छा लेख

http://embeddedgurus.com/stack-overflow/category/efficient-cc/page/4/ पाया

मैं निष्कर्ष (बोल्ड) जोड़ा बोली जाएगा

इस प्रकार नीचे की रेखा यह है। यदि आप कुशल, पोर्टेबल एम्बेडेड कोड लिखना शुरू करने के लिए चाहते हैं, तो पहला चरण को C99 डेटा प्रकारों 'कम से कम' और 'तेज़' का उपयोग करना शुरू करना चाहिए। यदि आपका कंपाइलर C99 अनुपालन नहीं है तो शिकायत होने तक शिकायत करें - या विक्रेताओं को बदलें। यदि आप यह परिवर्तन करते हैं तो मैं सोचता हूं कि कोड कोड में सुधार और गति में सुधार पर आप सुखद आश्चर्यचकित होंगे।

+2

char, int, short जैसे प्रकारों का उपयोग करके खराब अभ्यास है और एम्बेडेड सिस्टम के लिए वर्जित होना चाहिए। मैंने एक कंपाइलर (कोडवायरियर) देखा है जो आपको प्रत्येक प्रकार की लंबाई बदलने की अनुमति देता है। बस टाइप प्रकारों एचडी हेडर फ़ाइल का प्रयोग करें। जटिल होने के लिए – kmalmur

उत्तर

17

मैं हर वास्तुकला

नहीं तुम नहीं के लिए समारोह को फिर से लिखने के लिए है। C99 के stdint.h का उपयोग करें, जिसमें जैसे प्रकार हैं, जो कि 256 मानों को और अधिक तेज़ी से रखने में सक्षम एक प्रकार होगा।

फिर, प्लेटफ़ॉर्म से कोई फर्क नहीं पड़ता, प्रकार तदनुसार बदल जाएंगे और आप अपने कोड में कुछ भी नहीं बदलेंगे। यदि आपके प्लेटफ़ॉर्म में इन परिभाषितों का कोई सेट नहीं है, तो आप अपना स्वयं का जोड़ सकते हैं।

प्रत्येक फ़ंक्शन को फिर से लिखने से कहीं बेहतर है।

+0

+1 यह एक समाधान है और मुझे लगता है कि अधिक मानक (वैसे भी मैं अभी भी हार्डवेयर की चौड़ाई का पता नहीं लगा सकता) –

+1

@ हर्नन: आश्चर्य की बात नहीं है। सी कार्यान्वयन के बारे में परवाह नहीं करता है, और चौड़ाई ऐसी चीज है जिसे कुछ ओएस-विशिष्ट एपीआई के साथ उजागर करने की आवश्यकता होगी। – GManNickG

+0

कोडेवायरियर कंपाइलर सी 99 अनुपालन नहीं लगता है, मैं एम्बेडेडगुरस डॉट कॉम सलाह का पालन करूंगा, शिकायत कर सकता हूं या विक्रेता = पी –

1

ISA जो आप संकलित कर रहे हैं, पहले से ही संकलक के लिए जाना जाता है जब यह आपके कोड पर चलता है, तो आपकी सबसे अच्छी शर्त संकलन समय पर इसका पता लगाना है। अपने पर्यावरण के आधार पर, आप ऑटोकॉन्फ़/ऑटोमेक स्टाइल स्टफ से निम्न स्तर # ifdef से अपने विशिष्ट ट्यून को उस विशिष्ट आर्किटेक्चर पर ट्यून करने के लिए उपयोग कर सकते हैं, जो इसे चलाएगा।

+1

रास्ता। पॉल और एंड्री द्वारा प्रस्तावित 'sizeof (int) * CHAR_BIT' का उपयोग करें। – sbi

7
#include <limits.h> 

const int bitwidth = sizeof(int) * CHAR_BIT; 
+1

-1 'int' की चौड़ाई ओपी की तलाश नहीं थी ... –

1

मैं बिल्कुल समझ में नहीं आता तुम क्या मतलब द्वारा पूर्णांक "वहाँ के लिए उपयोग नहीं standar है" "के रूप में" रजिस्टर चौड़ाई "। मूल सी भाषा विनिर्देश में (C89/90) प्रकार int में निहित है कुछ संदर्भ जब कोई स्पष्ट प्रकार की आपूर्ति नहीं की जाती है। आपका register cregister int c के समतुल्य है और यह C89/90 में पूरी तरह से मानक है। ध्यान दें कि सी भाषा विनिर्देश के लिए कम से कम -32767 ... + 32767 रेंज का समर्थन करने के लिए int टाइप करना आवश्यक है, जिसका अर्थ है कि किसी प्लेटफ़ॉर्म int में कम से कम 16 मान-निर्माण बिट्स होंगे।

बिट चौड़ाई के लिए ...sizeof(int) * CHAR_BIT आपको int के ऑब्जेक्ट प्रस्तुति में बिट्स की संख्या देगा।

सैद्धांतिक रूप से, int के मान का प्रतिनिधित्व इसकी ऑब्जेक्ट प्रस्तुति के सभी बिट्स का उपयोग करने की गारंटी नहीं है। यदि आपको मूल्य प्रतिनिधित्व के लिए उपयोग की जाने वाली बिट्स की संख्या निर्धारित करने की आवश्यकता है, तो आप बस INT_MIN और INT_MAX मानों का विश्लेषण कर सकते हैं।

पीएस आपके प्रश्न के शीर्षक को देखते हुए, मुझे संदेह है कि आपको वास्तव में क्या चाहिए CHAR_BIT मान।

+0

समस्या यह है कि 16 या 8 बिट आर्किटेक्चर में, CHAR_BIT, INT_MIN और INT_MAX का एक ही मान है, इसलिए मैं इसका उपयोग नहीं कर सकता पहचान, कम से कम सबसे आम microcontroler compilers में। मुझे लगता है कि int के लिए मानक, 16 बिट्स और –

+0

से शुरू करें @ हर्नान: क्या आप कह रहे हैं कि इन आर्किटेक्चर पर 'CHAR_BIT == INT_MIN == INT_MAX'? क्या बकवास है! किसी भी प्रकार के 'टी' के लिए बिट्स की संख्या निर्धारित करने के लिए मानक-अनुरूप तरीका' आकार (टी) * CHAR_BIT' है। – sbi

+0

@ एसबीआई, उनके पास इस अर्थ में समान मूल्य है, CHAR_BIT (8 बिट्स) = CHAR_BIT (16 बिट्स), INT_MIN (8 बिट्स) = INT_MIN (16 बिट्स) आदि .. –

0

क्या unsigned char या unsigned short आपकी आवश्यकताओं के अनुरूप है? इसका उपयोग क्यों नहीं करें? यदि नहीं, तो उचित कोड लाने के लिए आपको संकलन समय झंडे का उपयोग करना चाहिए।

+0

डिफ़ॉल्ट मशीन शब्द आकार में कनवर्ट करते समय ओवरहेड होता है, इसलिए परिवर्तनीय के रूप में परिवर्तनीय का उपयोग करना –

7

अधिक सीधे अपने गहरे सवाल का जवाब करने के लिए, यदि आप बहुत विशिष्ट मेमोरी आकारों कि पोर्टेबल भर प्लेटफार्मों रहे हैं के लिए एक की जरूरत है, तो आप की तरह types.h stdint.h जो बिट्स की संख्या के साथ निर्दिष्ट भंडारण प्रकार परिभाषित करता है कुछ का उपयोग करना चाहिए।

उदाहरण के लिए, uint32_t हमेशा हस्ताक्षरित 32 बिट्स और int8_t हमेशा 8 बिट्स पर हस्ताक्षर किए जाते हैं।

+0

+1 जाने का सबसे अच्छा तरीका नहीं है यह एक समाधान है (फिर भी मैं अभी भी हार्डवेयर की चौड़ाई का पता नहीं लगा सकता) –

+0

Isn ' यह नहीं है कि 'unint32_t' _at कम से कम 32 बिट है? ICBWT। – sbi

+1

@ एसबीआई: उन्हें मैन पेज में सटीक चौड़ाई पूर्णांक कहा जाता है। लेकिन मैंने गलत हेडर फ़ाइल को संदर्भित किया। यह type.h नहीं है, लेकिन stdint.h। मैं जवाब सही कर रहा हूँ। –

0

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

+0

प्रश्न के अंतिम अनुच्छेद को देखते हुए, मुझे लगता है कि यह जाने का तरीका है। यदि आपके सभी मान 256 से कम हैं, तो 'uint8_t' का उपयोग करें। जब आपका सीपीयू इसे एक रजिस्टर में कॉपी करता है, तो यह बाकी रजिस्टर को भरने के लिए आवश्यकतानुसार साइन-इन करेगा। आपको रजिस्टर आकार से कम संख्याओं का उपयोग करने के लिए कोई प्रदर्शन जुर्माना नहीं देखना चाहिए। आपकी सबसे अच्छी शर्त 'stdint.h' से सबसे छोटे डेटा प्रकार का उपयोग करना है जो आपके सभी मानों का प्रतिनिधित्व कर सकती है। – bta

+0

शायद, लेकिन मुझे लगता है कि हस्ताक्षर किए गए चार सबसे पोर्टेबल उत्तर हैं, सिर्फ इसलिए कि stdint.h सी 99 से है, और पिछले में नहीं –

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

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