2010-04-16 14 views
9

में int int 4 बाइट्स या 2 बाइट्स है, मैं जानना चाहता हूं कि यह सुनिश्चित करने के लिए int कैसे घोषित किया जाए कि यह 4 बाइट्स या 2 बाइट्स में छोटा है, चाहे प्लेटफॉर्म पर कोई फर्क नहीं पड़ता। क्या सी 99 के पास नियम हैं?यह सुनिश्चित करने के लिए कि सी/सी ++

+0

@Pavel कि वास्तव में पूछे जाने वाले प्रश्न – Earlz

+1

@Pavel धन्यवाद में होना चाहिए, मैं बहुत खुश है कि मैं इंटरनेट पर StackOverflow पाया हूँ। – kkpattern

उत्तर

18

सी 99 इस बारे में ज्यादा कुछ नहीं कहता है, लेकिन आप यह जांच सकते हैं कि sizeof(int) == 4 है, या आप निश्चित आकार के प्रकार जैसे uint32_t (32 बिट्स हस्ताक्षरित पूर्णांक) का उपयोग कर सकते हैं। उन्हें stdint.h

+0

मैं जानना चाहता हूं कि आकार (int)! = 4 4 बाइट्स को स्वयं कैसे बनाया जाए। धन्यवाद – kkpattern

+0

आपको बहुत धन्यवाद, और सभी लोगों को भी धन्यवाद – kkpattern

+0

@kkpattern, ग्रेड पर क्लिक करके जवाब को "स्वीकार" करना सुनिश्चित करें इस उत्तर के बगल में चेकबॉक्स के बाहर। फिर यह हरा हो जाएगा और आपको एक अतिरिक्त 2 प्रतिनिधि मिलेगा :) – Earlz

0

limits.h

+0

नहीं, मुझे नहीं लगता कि वह एक int के अधिकतम संभव मूल्य की तलाश में है, वह एक int द्वारा उपयोग किए जाने वाले बाइट्स की संख्या सुनिश्चित करने के लिए एक तरीका ढूंढ रहा है। – FrustratedWithFormsDesigner

+0

तो? वे अविभाज्य हैं। एक 4 बाइट मान में केवल 2^32 मान हो सकते हैं। – Fred

+0

एक ही सिक्के के दो पक्ष, उच्चतम मूल्य के बाद से इस पर नाइटपिक करने की आवश्यकता नहीं है और संख्या का प्रतिनिधित्व करने के लिए आवश्यक बाइट्स की संख्या इतनी बारीकी से संबंधित है। – Fred

0

में INT_MAX निरंतर प्रयास करें आप 4 बाइट होने के लिए यह आवश्यकता करना चाहते हैं?

यदि आप केवल int के आकार को देखना चाहते हैं क्योंकि यह प्रत्येक प्लेटफॉर्म पर संकलित है तो आप केवल sizeof(int) कर सकते हैं।

+0

हाँ मैं इसे 4 बाइट्स की आवश्यकता चाहता हूं क्योंकि मुझे इसे सॉकेट संदेश में रखना होगा। – kkpattern

0

sizeof (int) वर्तमान प्रणाली पर स्मृति में int बाइट्स की संख्या वापस कर देगा।

8

यदि आप सी 99 का उपयोग कर रहे हैं और किसी दिए गए आकार के पूर्णांक प्रकार की आवश्यकता है, तो stdint.h शामिल करें। यह uint32_t जैसे 32-बिट्स के एक हस्ताक्षरित पूर्णांक के लिए uint_fast32_t को कम से कम 32 बिट्स के एक हस्ताक्षरित पूर्णांक और तेजी से कुछ परिभाषाओं द्वारा लक्ष्य मशीन पर "तेज़" के लिए प्रकारों को परिभाषित करता है।

संपादित करें: याद रखें कि आप भी bitfields उपयोग कर सकते हैं बिट्स की एक विशिष्ट संख्या प्राप्त करने के लिए (हालांकि यह सबसे अच्छा प्रदर्शन नहीं दे सकता है, विशेष रूप से "अजीब" आकार, और सबसे पहलुओं के साथ कर रहे हैं कार्यान्वयन से परिभाषित):

typedef struct { 
    unsigned four_bytes:32; 
    unsigned two_bytes:16; 
    unsigned three_bits:3; 
    unsigned five_bits:5; 
} my_message_t; 

संपादित करें 2: यह भी याद रखें कि sizeofchar एस की संख्या देता है। यह सैद्धांतिक रूप से संभव है (हालांकि इन दिनों बहुत ही असंभव है) कि char 8 बिट्स नहीं है; char में बिट्स की संख्या limits.h में CHAR_BIT के रूप में परिभाषित की गई है।

+0

बिटफील्ड अद्भुत है! :) धन्यवाद आप – kkpattern

+0

बस ध्यान दें कि बिटफील्ड का सटीक प्रतिनिधित्व कार्यान्वयन-निर्भर है और संकलक को अतिरिक्त कोड की अप्रत्याशित मात्रा उत्पन्न करने का कारण बन सकता है, उदाहरण के लिए 3 बिट्स जैसे "अजीब" फ़ील्ड आकारों को संभालने के लिए। और आपके पास बिटकफील्ड सदस्यों के लिए पॉइंटर्स नहीं हो सकते हैं, आदि। यदि आप उपयुक्त लोगों को ढूंढते हैं तो 'stdint.h' प्रकारों का उपयोग करना बेहतर होता है। लेकिन यदि हार्डवेयर आवश्यकताओं या ऐसे मेल खाने के लिए आपको डेटा पैक करने की आवश्यकता है तो बिटफील्ड आसान हो सकते हैं। – Arkku

+0

@ अर्कु बिट्टफील्ड इतना सूक्ष्म है। आपके लिए धन्यवाद नोट – kkpattern

0

मुझे लगता है कि आप केवल sizeof (int) == 4 चेक से परे कुछ चाहते हैं। शायद आप कुछ संकलन-समय की जांच चाहते हैं।

सी ++ में, आप BOOST_STATIC_ASSERT का उपयोग कर सकते हैं।

सी में, आप कोड लिखकर संकलन-समय के दावे कर सकते हैं जो असफलता पर नकारात्मक आकार के सरणी बनाने की कोशिश करता है या जो switch बयान को परिभाषित मामलों के साथ बनाने की कोशिश करता है। उदाहरण के लिए यह स्टैक ओवरफ्लो प्रश्न देखें: Ways to ASSERT expressions at build time in C

0

आप आकार (int) का उपयोग कर सकते हैं, लेकिन आप कभी भी यह नहीं समझ सकते कि कितना बड़ा int है। सी विनिर्देश किसी int के आकार पर कोई धारणा नहीं डालता है, सिवाय इसके कि यह एक छोटे के आकार के बराबर या बराबर होना चाहिए (जो कि चार के आकार के बराबर या बराबर होना चाहिए)।

अक्सर अंतर्निहित हार्डवेयर के लिए एक int aligns का आकार। इसका मतलब है कि एक int आमतौर पर एक शब्द के समान होता है, जहां एक शब्द मेमोरी बस (या कभी-कभी सीपीयू रजिस्टर चौड़ाई) से प्राप्त डेटा का कार्यात्मक आकार होता है। यह एक शब्द के समान नहीं होना चाहिए, लेकिन सबसे पहले नोट्स मैंने संकेत दिया है कि यह स्मृति हस्तांतरण के लिए पसंदीदा आकार होना चाहिए (जो आम तौर पर एक शब्द है)।

अतीत में, 18 बिट इन्स (पीडीपी -8) और 24 बिट इन्स (पीडीपी -15) रहे हैं। 36 बिट शब्द आकार (पीडीपी -11) के साथ आर्किटेक्चर रहे हैं, लेकिन मुझे याद नहीं है कि उनका int आकार क्या हुआ।

Linux प्लेटफार्मों पर, आप

#include <sys/types.h> 

प्रत्येक प्रकार के लिए वास्तविक बिट गणना प्राप्त करने में झांक सकते कर सकते हैं।

0

मुझे कल रात मिली कि विजुअल स्टूडियो 2008 सी 99 अच्छी तरह से समर्थन नहीं करता है, और यह stdint.h का समर्थन नहीं करता है। लेकिन उनके पास अपने प्रकार हैं। यहाँ एक उदाहरण है:

#ifdef _MSC_VER 
typedef __int8 int8_t; 
typedef unsigned __int8 uint8_t; 
typedef __int16 int16_t; 
typedef unsigned __int16 uint16_t; 
typedef __int32 int32_t; 
typedef unsigned __int32 uint32_t; 
typedef __int64 int64_t; 
typedef unsigned __int64 uint64_t; 
#else 
#include <stdint.h> 
#endif 
संबंधित मुद्दे