किसी भी stdlib हेडर में परिभाषित uint32, int32, uint64, int64 जैसे प्रकार हैं?


94

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

मेरे आवेदन स्रोत कोड पर इन प्रकारों का सबसे अच्छा तरीका क्या है?

जवाबों:


135

C99 stdint.hइन्हें परिभाषित करता है:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

और, अगर आर्किटेक्चर उनका समर्थन करता है:

  • int64_t
  • uint64_t

साथ ही विभिन्न अन्य पूर्णांक टाइप किए गए हैं stdint.h

यदि आप बिना C99 पर्यावरण के फंस गए हैं, तो आपको संभवतः अपने स्वयं के टाइफेड की आपूर्ति करनी चाहिए और वैसे भी C99 का उपयोग करना चाहिए।

uint32और uint64(यानी बिना _tप्रत्यय) शायद आवेदन विशिष्ट हैं।


16
यह उत्तर गलत है। उपरोक्त सभी केवल तभी उपलब्ध हैं यदि कार्यान्वयन में उस आकार (कोई पेडिंग) का एक सटीक चौड़ाई प्रकार मौजूद है। यहां तक कि अगर, हालांकि, प्रकार int_leastNN_tऔर uint_leastNN_tके लिए NN8, 16, 32, और 64 हमेशा मौजूद होना चाहिए । C99 कम से कम 64 बिट्स के पूर्णांक प्रकार के बिना कार्यान्वयन की अनुमति नहीं देता है, क्योंकि long longकम से कम उस बड़े होने की आवश्यकता है।
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

@R ..: क्या "C99 stdint.h" के बजाय "POSIX stdint.h" कहना सही होगा?
म्यू

1
POSIX stdint.hउन सभी की आवश्यकता है।
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

1
@ आर .., क्या आप कृपया इस उत्तर को शुद्धता के लिए संपादित कर सकते हैं? मुझे वर्तमान सामग्री और आपकी टिप्पणियों के संयोजन को पार्स करने में थोड़ा समय लगा।
merlin2011

SDL उर्फ ​​ऐसे typedef uint32_t Uint32;उपनामों को शामिल / SDL_stdinc.h (यदि आप SDL उपयोगकर्ता हैं) में
परिभाषित

10

उन पूर्णांक प्रकारों को सभी में परिभाषित किया गया है stdint.h


नहीं है stdint.hकार्यान्वयन-विशिष्ट? इस सवाल और इस सवाल को
क्रिस फ्रेडरिक

3
फाइल को देखकर मुझे टिप्पणियों में "आईएसओ C99: 7.18 पूर्णांक प्रकार <stdint.h>" मिला। मुझे लगता है कि stdint.hअगर आप C99 मानक का सम्मान कर रहे हैं तो आप प्राप्त करें ।
11'11

मुझे उनमें से कोई नहीं मिल रहा है stdint.h। यह 0 हिट देता है grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t:।
20

1
@jww: मेरे मामले में, उस फ़ाइल में शामिल है #include "stdint-gcc.h", और उस फ़ाइल को grepping करने से परिभाषाएँ मिलती हैं ।
विक्टर ज़मानियन

1
@ हाँ, वे मौजूद नहीं हैं। केवल वही जो मानक हैं और जिन्हें परिभाषित किया जाना चाहिए _t, प्रत्यय वाले हैं, जैसा कि ऊपर दिए गए उत्तर में सूचीबद्ध है।
विक्टर ज़मानियन

2

यदि आप C99 का उपयोग कर रहे हैं तो शामिल करें stdint.h। BTW, 64 बिट प्रकार के होते हैं यदि प्रोसेसर उनका समर्थन करता है।


कृपया इस संबंध में कुछ उद्धृत करें।
BiGYaN

6
x86 64-बिट गणित का समर्थन नहीं करता है, लेकिन 64-बिट प्रकार है।
R .. गिटहब स्टॉप हेल्पिंग ICE

2
हाँ यह करता है। यह 32-बिट x 32-बिट -> 64-बिट गुणन, 64-बिट / 32-बिट -> 32-बिट भागफल और 32-बिट शेष विभाजन का समर्थन करता है, साथ ही उधार निर्देशों के साथ ले जाने और घटाना के साथ है। यह 64-बिट अंकगणितीय प्रदर्शन करने में सक्षम होने के लिए बनाया गया था, यदि केवल इसलिए कि 8086 को 32-बिट अंकगणित करने में सक्षम होने की आवश्यकता थी।
माइकल मॉरिस

वहाँ भी uint128_tअगर एक __SIZEOF_INT128__16 या अधिक (जीसीसी और कंपेटिबल्स) को परिभाषित किया गया है। यह x86_64 / amd64 मशीनों पर उपलब्ध है, लेकिन प्रोसेसर मूल रूप से इसका समर्थन नहीं करता है। केवल क्रे के पास रजिस्टर आकार, IIRC है।
jww

0

प्रश्नकर्ता वास्तव में int16 (आदि) के बजाय (16) int16_t (आदि) के बारे में पूछता है।

कोई मानक हेडर नहीं हैं - और न ही लिनक्स के usr / us / / में कोई भी ऐसा फ़ोल्डर है जो उन्हें "_t" के बिना परिभाषित करता है।

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