C ++ में “long”, “long long”, “long int” और “long long int” में क्या अंतर है?


209

मैं जावा से C ++ में संक्रमण कर रहा हूं और longडेटा प्रकार के बारे में कुछ प्रश्न हैं । जावा में, 2 32 से अधिक पूर्णांक रखने के लिए , आप बस लिखेंगे long x;। हालाँकि, C ++ में, ऐसा लगता है कि longडेटा प्रकार और संशोधक दोनों है।

उपयोग करने के कई तरीके प्रतीत होते हैं long:

long x;
long long x;
long int x;
long long int x;

इसके अलावा, ऐसा लगता है कि इस तरह की चीजें हैं:

long double x;

और इसी तरह।

इन विभिन्न डेटा प्रकारों के बीच क्या अंतर है, और क्या उन सभी का उद्देश्य समान है?



2
@ user2612743 - सुरक्षित होने के लिए, अपनी आवश्यकताओं के बारे में सोचें और उपयुक्त प्रकार का उपयोग करें। long longसे धीमी हो सकती है long, जो की तुलना में धीमी हो सकती है int
पीट बेकर


1
नहीं, "सुरक्षित होने के लिए, लंबे समय तक उपयोग करें" यह कहने के लिए समान है "सुरक्षित होने के लिए, बस सभी को एक पृथ्वी एड्स दें, इसलिए हमें सुरक्षित सेक्स के बारे में चिंता करने की ज़रूरत नहीं है, हम सभी इसे पहले से ही किसी भी तरह से प्राप्त कर चुके हैं!" मूर्ख, नहीं? डेटा के बारे में सोचें और इसके क्या संभावित मूल्य हो सकते हैं, और सर्वश्रेष्ठ-फिटिंग प्रकार का उपयोग कर सकते हैं। यह मूल कोड के इरादे को तोड़ने के बिना कंपाइलर को अतिरिक्त अनुकूलन करने में भी मदद करता है, जैसे कि लक्ष्य प्लेटफॉर्म की प्राकृतिक बिट-चौड़ाई से बड़ी संख्या को संभालने के लिए अतिरिक्त लाइब्रेरीज़ को लोड करना पड़ता है।
सीएम

Win32 लिस्टबॉक्स के साथ लंबे समय का उपयोग करना और इस तरह अपनी स्मृति और अन्य चर के साथ कहर खेलना नहीं है- भले ही सीमाएं भंग न हों। यहां तक ​​कि सहज दिखने वाले C4244 चेतावनियों के साथ भी इसका पता लगाना आसान नहीं है।
लॉरी स्टर्न

जवाबों:


182

longऔर long intसमान हैं। तो long longऔर हैं long long int। दोनों ही मामलों में, intवैकल्पिक है।

दो सेटों के बीच के अंतर के रूप में, C ++ मानक प्रत्येक के लिए न्यूनतम सीमा को अनिवार्य करता है, और यह कमlong long से कम जितना विस्तृत है long

मानक के नियंत्रक भाग (C ++ 11, लेकिन यह एक लंबे समय के लिए चारों ओर है) एक के लिए हैं 3.9.1 Fundamental types, खंड 2, (बाद का खंड, अहस्ताक्षरित अभिन्न प्रकारों के लिए समान नियम देता है):

पांच मानक हस्ताक्षरित पूर्णांक प्रकार हैं: हस्ताक्षरित चार, लघु इंट, इंट, लंबे इंट, और लंबे लंबे इंट। इस सूची में, प्रत्येक प्रकार कम से कम उतना भंडारण प्रदान करता है जितना कि सूची में आने से पहले।

इसमें एक तालिका 9 भी है 7.1.6.2 Simple type specifiers, जो वास्तविक प्रकारों को निर्दिष्ट करने वालों की "मैपिंग" दिखाती है (यह दिखाते हुए कि intयह वैकल्पिक है), जिसका एक खंड नीचे दिखाया गया है:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

विनिर्देशक और प्रकार के बीच अंतर पर ध्यान दें। विनिर्देशक यह है कि आप संकलक को यह बताएं कि प्रकार क्या है, लेकिन आप एक ही प्रकार के अंत में विभिन्न विनिर्देशक का उपयोग कर सकते हैं।

इसलिए longअपने आप में न तो एक प्रकार है औरही एक संशोधक है जैसा कि आपका प्रश्न बताता है, यह केवल long intप्रकार के लिए एक निर्दिष्ट है । Ditto प्रकार के लिए long longएक विनिर्देशक होने के लिए long long int

यद्यपि C ++ मानक स्वयं अभिन्न प्रकारों की न्यूनतम सीमाओं को निर्दिष्ट नहीं करता है, लेकिन यह C99 1.2 Normative referencesको लागू करने के रूप में उद्धृत करता है । इसलिए C99 5.2.4.2.1 Sizes of integer types <limits.h>लागू न्यूनतम सीमाएं लागू हैं।


के संदर्भ में long double, यह वास्तव में एक पूर्णांक के बजाय एक अस्थायी बिंदु मान है। अभिन्न प्रकारों के समान, इसके लिए कम से कम उतनी ही सटीकता की आवश्यकता होती है doubleऔर उस प्रकार से अधिक मान प्रदान करने के लिए ( कम से कम उन मानों का अर्थ है , आवश्यक नहीं है) अधिक मूल्य)।


4
इसी बात के साथ unsignedऔरunsigned int
काल

2
मुझे पूरा यकीन longहै कि कम से कम 32 बिट्स (शून्य के दोनों ओर 2 ^ 31-1) और long longकम से कम 64 (2 ^ 63-1 दोनों तरफ) है।
क्रिस

2
और long doubleकम से कम रेंज की गारंटी है double, लेकिन यह समान हो सकता है। यह कंप्यूटर पर निर्भर करता है। कुछ एफपीयू ने सटीक विस्तार किया है; x87 चिप्स में 32-बिट एकल परिशुद्धता, 64-बिट डबल परिशुद्धता और 80-बिट विस्तारित परिशुद्धता थी।
एरिक Jablow

सीमा आवश्यकताओं के लिए, C ++ 11 मानक C11 मानक को संदर्भित करता है, जिसमें वास्तविक सीमाएं होती हैं।
क्रिस

"Int" भाग केवल एक पूर्णांक प्रकार और फ्लोटिंग पॉइंट, कैरेक्टर या अन्य गैर-पूर्णांक प्रकार के बीच अंतर करता है। कई मामलों में, यह संकलक द्वारा अनुमान लगाया जा सकता है, इसलिए इसे गिरा दिया जा सकता है - यही कारण है कि "अहस्ताक्षरित" उदाहरण के लिए "अहस्ताक्षरित इंट" के समान है। "इंट" भाग को बस मान लिया जाता है जब तक कि प्रोग्रामर कुछ और निर्दिष्ट नहीं करता है, जैसे कि "चार" या "डबल"। के रूप में इस्तेमाल किया वास्तविक आकार के लिए .. आप किस मानक को पढ़ते हैं, इसके आधार पर प्रत्येक आकार में न्यूनतम बिट्स हो सकते हैं, लेकिन वे सभी इस तरह परिभाषित होते हैं कि प्रत्येक कम से कम पिछले प्रकार जितना बड़ा हो।
CM

64

लंबे और लंबे इंट कम से कम 32 बिट्स हैं।

लंबे लंबे और लंबे लंबे int कम से कम 64 बिट्स हैं। आपको एक c99 संकलक या बेहतर का उपयोग करना चाहिए।

लंबे डबल्स थोड़े अजीब हैं। जानकारी के लिए उन्हें विकिपीडिया पर देखें।


17

longके बराबर है long int, बस के shortबराबर है short int। एक long intएक हस्ताक्षरित अभिन्न प्रकार है वह यह है कि कम से कम 32 बिट है, जबकि एक long longया long long intएक हस्ताक्षरित अभिन्न प्रकार है कम से कम 64 बिट्स।

यह जरूरी नहीं कि इसका मतलब यह है कि एक long longकी तुलना में व्यापक है long। कई प्लेटफार्मों / ABI LP64मॉडल का उपयोग करते हैं - जहां long(और संकेत) 64 बिट्स चौड़े हैं। Win64 का उपयोग करता है LLP64, जहां longअभी भी 32 बिट्स है, औरlong long (और पॉइंटर्स) 64 बिट्स चौड़े हैं।

यहां 64-बिट डेटा मॉडल का अच्छा सारांश है

long doubleबहुत से अन्य की गारंटी नहीं है यह कम से कम एक के रूप में व्यापक हो जाएगा double


7

यह भ्रामक लगता है क्योंकि आप ले रहे हैं long स्वयं एक डेटाटाइप के रूप ।

long केवल के लिए आशुलिपि के अलावा कुछ भी नहीं है long intजब आप इसे अकेले उपयोग कर रहे हों तो ।

longएक संशोधक है, आप इसे इस doubleरूप में भी उपयोग कर सकते हैंlong double

long== long int

दोनों ने 4 बाइट्स लिए।


लंबे 4 बाइट्स लेना केवल Win64 पर मान्य है, यह प्लेटफॉर्म पर निर्भर है
प्रोडिगल

1
हां जाहिर है ... न केवल लंबे ... int 4 बाइट्स लेता है और 2 बाइट्स प्लेटफॉर्म पर निर्भर करते हैं, इसमें कोई शक नहीं है।
सिराज आलम

3

ऐतिहासिक रूप से, शुरुआती सी समय में, जब प्रोसेसर में 8 या 16 बिट वर्डलेंग्थ intथा , आज के short(16 बिट) के समान था । एक निश्चित अर्थ में, पूर्णांक की तुलना में अधिक सार डेटा प्रकार है char, short, longया long long, के रूप में क्या आप वाकई bitwidth के बारे में नहीं हो सकता।

जब int n;आप इसे परिभाषित कर सकते हैं, तो "मुझे इस मशीन पर बिटकॉइन और स्पीड का सबसे अच्छा समझौता दें"। हो सकता है कि भविष्य में आपको कंपाइलरों से int64 बिट होने की उम्मीद करनी चाहिए । इसलिए जब आप चाहते हैं कि आपके वैरिएबल में 32 बिट्स हों और अधिक न हों, तो longडेटा टाइप के रूप में बेहतर तरीके से उपयोग करें।

[संपादित करें: #include <stdint.h>int ## _ t प्रकारों का उपयोग करके बिटवॉइट्स को सुनिश्चित करने का उचित तरीका प्रतीत होता है, हालांकि यह मानक का हिस्सा नहीं है।]


2
वह अंतिम भाग, जब "बिट" का उपयोग 32-बिट प्राप्त करने के लिए होता है जब इंट 64-बिट होता है, गलत है। यदि इंट 64-बिट है, तो लंबे समय तक कम से कम 64-बिट होगा, साथ ही। लंबे समय तक कम से कम इंट के रूप में बड़े होने की गारंटी है , हालांकि यह बड़ा हो सकता है, लेकिन कभी छोटा नहीं होता। अधिकांश संकलक में विभिन्न विधियाँ होती हैं जो प्रोग्रामर को अधिक विशिष्ट बनाने की अनुमति देती हैं, जैसे कि (गैर-पोर्टेबल) __int32 प्रकार जो कि वास्तव में 32-बिट्स है, और इसी तरह।
CM

1
जैसा कि सी मानक में परिभाषित किया गया है, एक कम से कम 32 बिट longहोने की गारंटी है । (मानक कठिन हो सकते हैं।) वर्तमान C ++ 14 ड्राफ्ट में केवल यह कहा गया है: @ CM "सादे ints में निष्पादन के माहौल की वास्तुकला द्वारा सुझाए गए प्राकृतिक आकार हैं, जो अन्य हस्ताक्षर किए गए पूर्णांक प्रकार विशेष आवश्यकताओं को पूरा करने के लिए प्रदान किए गए हैं" (धारा 3.9.1 )। मुझे इसमें विभिन्न आकृतियों के लम्बे संबंधों के बारे में कोई शब्द नहीं मिला। __int32 वास्तव में मानक का हिस्सा नहीं है, लेकिन C ++ 11 के बाद से वहाँ typedefs उपलब्ध हैं जैसे कि int_fast32_t या int_least32_t आपको जो चाहिए वह पाने के लिए उपलब्ध है।
thomiel

मैं कहता हूँ कि बीसवीं सदी के सामान्य प्रयोजन के लिए पुन: लागू होने योग्य माइक्रो कंप्यूटरों पर, charलगभग 8 बिट्स shortथा, 16 था, और long32 था; intया तो 16 या 32 हो सकता है। कुछ प्लेटफार्मों (esp। 68000) के लिए नोट 16-बिट और 32-बिट intदोनों काफी सामान्य थे, और वास्तव में कुछ कंपाइलरों के पास या तो समर्थन करने के लिए विकल्प थे। इस प्रकार कोड को पोर्टेबल होने की आवश्यकता थी, इस प्रकार उपयोग करने के लिए shortया longवरीयता में अपेक्षित था int
सुपरकैट

0

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

इससे बचने short int long ... और उपयोग करने के लिए अच्छा C ++ स्टाइल माना जाता है :

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

हेडर को int*_tशामिल करने के बाद इन ( ) का उपयोग किया जा सकता है <cstdint>size_tमें है <stdlib.h>

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