Size_t और अहस्ताक्षरित int के बीच अंतर?


107

मैं बहुत उलझन में हूँ size_t। मैंने इंटरनेट पर खोज की है और हर जगह उल्लेख किया है कि size_tएक अहस्ताक्षरित प्रकार है, इसलिए यह केवल गैर-नकारात्मक मूल्यों का प्रतिनिधित्व कर सकता है।

मेरा पहला सवाल है: यदि इसका उपयोग केवल गैर-नकारात्मक मूल्यों का प्रतिनिधित्व करने के लिए किया जाता है, तो हम unsigned intइसके बजाय का उपयोग क्यों नहीं करते हैं size_t?

मेरा दूसरा सवाल है: हैं size_tऔर unsigned intविनिमेय हैं या नहीं? यदि नहीं, तो क्यों?

और क्या कोई मुझे इसका एक अच्छा उदाहरण दे सकता है size_tऔर इसके कामकाज को संक्षेप में बता सकता है?


5
typedef /*This part is implementation dependent */ size_t;
P0W

जवाबों:


87

यदि इसका उपयोग गैर नकारात्मक मूल्य का प्रतिनिधित्व करने के लिए किया जाता है तो हम unsigned intइसके बजाय का उपयोग क्यों नहीं कर रहे हैंsize_t

क्योंकि unsigned intकेवल अहस्ताक्षरित पूर्णांक प्रकार नहीं है। size_tके किसी भी हो सकता है unsigned char, unsigned short, unsigned int, unsigned longया unsigned long long, कार्यान्वयन के आधार पर।

दूसरा सवाल यह है कि size_tऔर unsigned intविनिमेय हैं या नहीं और यदि नहीं तो क्यों?

ऊपर दिए गए कारण के लिए वे विनिमेय नहीं हैं ^^

और क्या कोई मुझे size_t और इसके संक्षिप्त काम का एक अच्छा उदाहरण दे सकता है?

मुझे यह नहीं मिलता कि आप "इसके संक्षिप्त काम" से क्या मतलब है। यह किसी भी अन्य अहस्ताक्षरित प्रकार की तरह काम करता है (विशेष रूप से, यह टाइप किए गए प्रकार की तरह है)। size_tजब आप किसी ऑब्जेक्ट के आकार का वर्णन कर रहे हों, तो आपको उपयोग करने के लिए प्रोत्साहित किया जाता है। विशेष रूप से, sizeofऑपरेटर और विभिन्न मानक पुस्तकालय कार्य, जैसे strlen(), वापसी size_t

बोनस: यहांsize_t (और निकटता से संबंधित ptrdiff_tप्रकार) के बारे में एक अच्छा लेख है । यह बहुत अच्छी तरह से कारण है कि आपको इसका उपयोग क्यों करना चाहिए।


1
वास्तव में कैसे हो size_tसकता है unsigned char? क्या यह इस मानक में है कि इसकी अनुमति है? मेरा मतलब है कि इस विचार से किसी को भी calloc()(और परिवार) का उपयोग करने की उम्मीद कैसे की जा सकती है strlen()? जो मुझे बेतुका लगता है।
प्रिएफ्तान

मुझे लगता size_tहै कि एक "अहस्ताक्षरित पूर्णांक प्रकार" होने के लिए मानक में परिभाषित किया गया है, लेकिन इसमें से किसी के समान होने की आवश्यकता नहीं है unsigned {char, short, int, long, long long}
पॉल हैंकिन

80

C में 5 मानक अहस्ताक्षरित पूर्णांक प्रकार हैं:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

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

size_ttypedefकुछ अहस्ताक्षरित प्रकार के लिए एक (यानी, एक उपनाम) है, (उपरोक्त में से एक है, लेकिन संभवतः एक विस्तारित अहस्ताक्षरित प्रकार है , हालांकि यह संभावना नहीं है)। यह sizeofऑपरेटर द्वारा उत्पादित प्रकार है ।

एक प्रणाली पर, यह unsigned intआकार का प्रतिनिधित्व करने के लिए उपयोग करने के लिए समझ में आता है ; दूसरे पर, यह उपयोग करने के लिए अधिक समझ में आता है unsigned longया हो सकता है unsigned long long। ( या size_tतो होने की संभावना नहीं है , लेकिन इसकी अनुमति है)।unsigned charunsigned short

इसका उद्देश्य size_tप्रोग्रामर को इस बात से राहत दिलाना है कि किस प्रकार के पूर्वनिर्धारित प्रकारों का उपयोग आकारों का प्रतिनिधित्व करने के लिए किया जाता है।

कोड जो sizeofउपज देता है unsigned intवह पोर्टेबल नहीं होगा। कोड जो मानता है कि यह पैदावार size_tपोर्टेबल होने की अधिक संभावना है।


6
मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए क्योंकि यह बताता है कि आपको size_t
kuchi

@ कीथ-थॉम्पसन तो इसका मतलब है कि विशेष प्रकार (यानी करता है unsigned int, unsigned longआदि) कि size_tमेल खाती है करने के लिए मशीन पर निर्भर करता है, जिस पर कोड चलाया जाता है? यानी एक मशीन आर्किटेक्चर पर, यह मेल खाती है, unsigned intलेकिन दूसरे आर्किटेक्चर पर यह किसके अनुरूप होगा unsigned long, आदि?
रिची थॉमस

1
@ रीचीहोम्स: यह सी कार्यान्वयन पर निर्भर करता है। एक ही आर्किटेक्चर पर दो अलग-अलग कंपाइलर विभिन्न प्रकारों को चुन सकते हैं size_t, खासकर यदि, उदाहरण के लिए, unsigned longऔर unsigned long longएक ही आकार के हों।
कीथ थॉम्पसन

@ रीचीहोम्स इसका हिस्सा हैं। यह कहना है कि अधिकतम long, long longआदि सिस्टम पर निर्भर करते हैं: यदि आप एक नज़र डालते हैं limits.hतो आप कम से कम यूनिकस के तहत देखेंगे कि ints के लिए अधिकतम मूल्य सिस्टम के शब्द आकार पर निर्भर करता है।
प्रीफटन

1
@Pryftan मोटोरोला 68000 श्रृंखला पर एक नज़र डालें, यह भी पुरानी इंटेल x86 श्रृंखला (8086 और 8088 में वापस जा रही है)।
कीथ थॉम्पसन

10

size_t एक विशिष्ट प्रतिबंध है।

Http://www.cplusplus.com/reference/cstring/size_t/ से उद्धरण :

मौलिक अहस्ताक्षरित पूर्णांक प्रकारों में से एक का उपनाम।

यह एक प्रकार है जो बाइट्स में किसी भी वस्तु के आकार का प्रतिनिधित्व करने में सक्षम है : size_t वह आकार प्रकार ऑपरेटर द्वारा लौटाया जाता है और इसका उपयोग मानक पुस्तकालय में आकारों और गणनाओं का प्रतिनिधित्व करने के लिए व्यापक रूप से किया जाता है।

यह विनिमेय नहीं है unsigned intक्योंकि इसका आकार intडेटा मॉडल द्वारा निर्दिष्ट किया गया है। उदाहरण के लिए LLP64 32-बिट intका उपयोग करता है और ILP64 64-बिट का उपयोग करता है int


5
वह उद्धरण कहाँ से है? (यह C मानक से नहीं है।)
कीथ थॉम्पसन

2
प्रश्न सी टैग किया गया है । C ++ मानक का C पर कोई असर नहीं है
IInspectable

7

size_t का उपयोग डेटा ऑब्जेक्ट्स के आकार को संग्रहीत करने के लिए किया जाता है, और किसी भी डेटा ऑब्जेक्ट के आकार को धारण करने में सक्षम होने की गारंटी दी जाती है जो विशेष C कार्यान्वयन बना सकते हैं। यह डेटा प्रकार छोटा हो सकता है (बिट की संख्या में), बड़ा या बिल्कुल अहस्ताक्षरित इंट के समान।


4

अन्य उत्तरों के अलावा यह कोड को भी दस्तावेज करता है और लोगों को बताता है कि आप स्मृति में वस्तुओं के आकार के बारे में बात कर रहे हैं


अच्छी बात। एक appleएक है सेब , एक size_tएक है आकार ...
dom_beau

2

size_t प्रकार C / C ++ भाषा का एक आधार अहस्ताक्षरित पूर्णांक प्रकार है। यह आकार के ऑपरेटर द्वारा लौटाए गए परिणाम का प्रकार है। प्रकार का आकार इसलिए चुना जाता है ताकि वह किसी भी प्रकार के सैद्धांतिक रूप से संभव सरणी के अधिकतम आकार को संग्रहीत कर सके। 32-बिट सिस्टम size_t पर 32 बिट्स लेंगे, 64- बिट एक 64 बिट्स पर। दूसरे शब्दों में, size_t प्रकार का एक चर सुरक्षित रूप से एक पॉइंटर स्टोर कर सकता है। अपवाद वर्ग कार्यों के लिए संकेत है लेकिन यह एक विशेष मामला है। हालांकि size_t एक पॉइंटर को स्टोर कर सकता है, उस उद्देश्य के लिए एक और अहस्ताक्षरित पूर्णांक प्रकार uintptr_t का उपयोग करना बेहतर है (इसका नाम इसकी क्षमता को दर्शाता है)। प्रकार size_t और uintptr_t पर्यायवाची हैं। size_t प्रकार का उपयोग आमतौर पर लूप काउंटर, एरे इंडेक्सिंग और एड्रेस अंकगणित के लिए किया जाता है। Size_t प्रकार का अधिकतम संभव मूल्य निरंतर SIZE_MAX है।


1
size_tकिसी भी एक वस्तु के आकार को संग्रहित कर सकता है। एक सूचक किसी भी वस्तु के किसी भी बाइट को इंगित कर सकता है। आपके पास एक प्रणाली हो सकती है, उदाहरण के लिए, 64-बिट पता स्थान जो किसी भी एक वस्तु के आकार को 2 ** 32-1 बाइट्स तक सीमित करता है। इसकी कोई गारंटी नहीं है size_tऔर uintptr_tएक ही प्रकार के हैं।
कीथ थॉम्पसन

1

सरल शब्दों में size_t प्लेटफ़ॉर्म है और साथ ही कार्यान्वयन निर्भर है जबकि अहस्ताक्षरित int केवल प्लेटफ़ॉर्म निर्भर है।

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