2009-08-05 13 views
18

यह निम्नलिखित प्रश्न से संबंधित है,सी में हमेशा int-32 है?

How to Declare a 32-bit Integer in C

कई लोगों ने उल्लेख किया पूर्णांक हमेशा सबसे प्लेटफार्मों पर 32-बिट है। अगर यह सच है तो मैं उत्सुक हूं।

क्या आप किसी भिन्न आकार के int के साथ किसी भी आधुनिक प्लेटफ़ॉर्म को जानते हैं? 8-बिट या 16-बिट आर्किटेक्चर के साथ डायनासोर प्लेटफार्मों को अनदेखा करें।

नोट:मुझे पहले से ही पता है कि दूसरे प्रश्न से 32-बिट पूर्णांक कैसे घोषित किया जाए। यह एक सर्वेक्षण की तरह है कि यह पता लगाने के लिए कि कौन से प्लेटफॉर्म (सीपीयू/ओएस/कंपाइलर) अन्य आकारों के साथ पूर्णांक का समर्थन करते हैं।

+10

आधुनिक 8 बिट और 16 बिट प्रोसेसर हैं, बस पीसी वातावरण में नहीं। – Gerhard

उत्तर

39

जैसा कि कई लोगों ने कहा है, इस बात की कोई गारंटी नहीं है कि एक 'int' 32 बिट्स होगा, यदि आप किसी विशिष्ट आकार के चर का उपयोग करना चाहते हैं, खासकर जब कोड लिखना जिसमें बिट मैनिप्लेशंस शामिल है, तो आपको 'मानक' सी 99 विनिर्देश द्वारा अनिवार्य एकीकृत प्रकार '।

int8_t 
uint8_t 
int32_t 
uint32_t 

आदि ...

वे प्रपत्र [u] intN_t, जहां 'यू' यह बताता है कि आप एक अहस्ताक्षरित मात्रा चाहते हैं के आम तौर पर कर रहे हैं, और एन बिट्स की संख्या है

इनके लिए सही टाइपपीफ्स जो भी प्लेटफार्म आप संकलित कर रहे हैं, उस पर stdint.h में उपलब्ध होना चाहिए, इनके उपयोग से आप अच्छे, पोर्टेबल कोड लिख सकते हैं :-)

+0

+1 सरल, साफ, बस काम करता है;) –

+0

+1, इसके साथ जाएं। – nielsj

+5

अच्छा जवाब, सिर्फ सवाल के लिए नहीं पूछा :) – Christoffer

2

यह आपके कंपाइलर पर काफी निर्भर करता है। कुछ 64-बिट मशीनों पर 64-बिट के रूप में संकलित करते हैं, कुछ उन्हें 32-बिट के रूप में संकलित करते हैं। एम्बेडेड सिस्टम मोम की अपनी छोटी विशेष गेंद हैं।

बेस्ट बात आप कर सकते हैं की जाँच करने के:

printf("%d\n", sizeof(int)); 

ध्यान दें कि sizeof बाइट्स बाहर प्रिंट होगा। बिट्स प्राप्त करने के लिए sizeof(int)*CHAR_BIT करें।

कोड विभिन्न प्रकारों के लिए बिट्स की संख्या मुद्रित करने के लिए:

#include <limits.h> 
#include <stdio.h> 

int main(void) { 
    printf("short is %d bits\n",  CHAR_BIT * sizeof(short) ); 
    printf("int is %d bits\n",  CHAR_BIT * sizeof(int ) ); 
    printf("long is %d bits\n",  CHAR_BIT * sizeof(long) ); 
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long)); 
    return 0; 
} 
+0

यह कई आयामों पर गलत है। सबसे पहले, 'sizeof' प्रकारों पर काम कर सकता है इसलिए 'randomint' की आवश्यकता नहीं है। दूसरा, 'CHAR_BITS' आठ होने की गारंटी नहीं है। कुछ और चीजें हैं लेकिन ये प्रश्न से संबंधित त्रुटियां हैं। –

+0

सच है, बाइट –

+0

@Eric में हमेशा 8-बिट्स नहीं @Eric इसकी 'CHAR_BIT'। मैंने इसे अपनी टिप्पणी में गलत वर्तनी दी। –

12

"हमेशा होता हैसबसे प्लेटफार्मों पर 32-बिट" - क्या है कि स्निपेट के साथ गलत क्या है? :-)

सी मानक के वैरिएबल के आकार जनादेश नहीं है। यह जनादेश सापेक्ष आकार, उदाहरण के लिए, sizeof(int) >= sizeof(short) और इसी तरह से। यह न्यूनतम श्रेणियों को भी जरूरी बनाता है लेकिन एकाधिक एन्कोडिंग योजनाओं (दो पूरक, एक 'पूरक, और साइन/परिमाण) की अनुमति देता है।

आप एक विशिष्ट आकार चर चाहते हैं, आप एक मंच आप इस तरह के #ifdef के के उपयोग के रूप में चला रहे हैं, के लिए उपयुक्त उपयोग करने की आवश्यकता है, कुछ की तरह:

#ifdef LONG_IS_32BITS 
    typedef long int32; 
#else 
    #ifdef INT_IS_32BITS 
     typedef int int32; 
    #else 
     #error No 32-bit data type available 
    #endif 
#endif 

वैकल्पिक रूप से, C99 की अनुमति देता है सटीक चौड़ाई पूर्णांक प्रकार intN_t और uintN_t के लिए:


  1. typedef नाम intN_t वाई के साथ एक हस्ताक्षरित पूर्णांक प्रकार निर्दिष्ट डीटीएच N, कोई पैडिंग बिट्स, और एक दो के पूरक प्रतिनिधित्व। इस प्रकार, int8_t वास्तव में 8 बिट की चौड़ाई के साथ एक हस्ताक्षरित पूर्णांक प्रकार को दर्शाता है।
  2. typedef नाम uintN_t चौड़ाई N साथ एक अहस्ताक्षरित पूर्णांक प्रकार निर्दिष्ट करता है। इस प्रकार, uint24_t वास्तव में 24 बिट की चौड़ाई के साथ एक अहस्ताक्षरित पूर्णांक प्रकार को दर्शाता है।
  3. ये प्रकार वैकल्पिक हैं।हालांकि, यदि कोई कार्यान्वयन 8, 16, 32, या 64 बिट्स, कोई पैडिंग बिट्स और (हस्ताक्षरित प्रकारों के लिए) के साथ पूर्णांक प्रकार प्रदान करता है जिसमें दो पूरक पूरक हैं, तो यह संबंधित टाइप किए गए नामों को परिभाषित करेगा।
+2

मुझे इसे मारो :) सी या सी ++ में अंतर्निर्मित चर के आकार पर निर्भरता मूल रूप से एक बग है। – kyoryu

+6

सी मानक न्यूनतम सीमाओं को जरूरी करता है (जो न्यूनतम आकार का तात्पर्य है)। Int की न्यूनतम सीमा -32767 से +32767 है, और लंबी अवधि की न्यूनतम सीमा -2147483647 +2147483647 है। – caf

+3

(जिसका अर्थ यह है कि यदि आप केवल एक चर चाहते हैं जो 32 बिट पूर्णांक की सीमा को संग्रहीत कर सकता है, तो लंबे या हस्ताक्षरित लंबे समय तक उपयोग करें - कोई प्रीप्रोसेसर बोडीनेस आवश्यक नहीं है)। – caf

2

नहीं। छोटे एम्बेडेड सिस्टम 16 बिट पूर्णांक का उपयोग करते हैं।

5

समय में इस समय, सबसे डेस्कटॉप और सर्वर प्लेटफार्मों 32-बिट पूर्णांकों का उपयोग करें, और यहां तक ​​कि कई एम्बेडेड प्लेटफार्मों (लगता है हाथ में हाथ या 86) का उपयोग 32-बिट int रों। 16-बिट int पर जाने के लिए आपको वास्तव में बहुत छोटा होना होगा: "बर्कले मोटे" या कुछ छोटे एटम एमेमेगा चिप्स को सोचें। लेकिन वे वहाँ बाहर हैं।

+0

यय, एकमात्र उत्तर जो वास्तव में प्रश्न का उत्तर देता है! हालांकि, यह जानना बहुत अच्छा होगा कि आपको यह जवाब कहां मिला और 32 बिट का उपयोग करने वाले विशिष्ट कंपाइलर/प्लेटफ़ॉर्म, या शायद 32 बिट का उपयोग न करें। –

1

खैर, अधिकांश एआरएम-आधारित प्रोसेसर थंब कोड चला सकते हैं, जो एक 16-बिट मोड है। इसमें अभी तक केवल अफवाहें वाली एंड्रॉइड नोटबुक और खून बहने वाले स्मार्टफ़ोन शामिल हैं।

इसके अलावा, कुछ ग्राफिंग कैलकुलेटर 8-बिट प्रोसेसर का उपयोग करते हैं, और मैं उनको बिल्कुल आधुनिक कहूंगा।

+2

आपके पास 8 बिट int के साथ एक अनुरूप सी कार्यान्वयन नहीं हो सकता है, इसलिए यदि उन कैलकुलेटर 8-बिट हैं, यदि उनके पास सी कंपाइलर है तो इसे कम से कम 16 बिट करना चाहिए। –

+0

आह, यह सही है। – Christoffer

+0

थंब कोड अभी भी 32-बिट int का उपयोग करता है; '16-बिट 'पहलू केवल एन्कोडेड निर्देशों का आकार है। –

1

टीआई अभी भी उन पर C55x डीएसपी के साथ ओएमएपी बोर्ड बेच रहे हैं, मुख्य रूप से वीडियो डिकोडिंग के लिए उपयोग किया जाता है। मेरा मानना ​​है कि इसके लिए आपूर्ति किए गए कंपाइलर में 16 बिट int है। यह शायद ही डायनासोर (नोकिया 770 2005 में जारी किया गया था), हालांकि आप 32 बिट डीएसपी प्राप्त कर सकते हैं।

आपके द्वारा लिखे गए अधिकांश कोड, आप सुरक्षित रूप से मान सकते हैं कि यह कभी भी डीएसपी पर नहीं चलाया जाएगा। लेकिन शायद सभी नहीं।

0

यदि आप बिट्स की संख्या के बजाय वास्तविक अधिकतम/न्यूनतम मान में रुचि रखते हैं, तो limits.h में आप जो कुछ जानना चाहते हैं उसे बहुत अधिक है।

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