2009-09-22 22 views
75

मैं जीएनयू के सी पर इस कोड को कोशिश कर रहा हूँ ++ संकलक में और उसके व्यवहार को समझने में असमर्थ हूँ:लंबे C/C++

#include <stdio.h>; 

int main() 
{ 
    int num1 = 1000000000; 
    long num2 = 1000000000; 
    long long num3; 
    //num3 = 100000000000; 
    long long num4 = ~0; 

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3)); 
    printf("%d %ld %lld %llu", num1, num2, num3, num4); 
    return 0; 
} 

जब मैं टिप्पणी की लाइन uncomment, कोड संकलन नहीं करता है और एक दे रहा है त्रुटि:

error: integer constant is too large for long type

लेकिन, अगर कोड के रूप में यह है संकलित किया गया है और मार डाला जाता है, यह 10000000000.

क्यों से भी ज्यादा बड़ा मान उत्पादन होता है?

+6

बहुत देर हो सकती है लेकिन भविष्य के पाठकों के लिए, मेरा सुझाव है कि आप ' 'का उपयोग करें और' uint64_t' का उपयोग करें। 64 बिट मान प्रदर्शित करने के लिए, 'printf ("%" PRIu64 "\ n", val); ' – enthusiasticgeek

उत्तर

136

पत्र 100,000,000,000 एक शाब्दिक पूर्णांक लगातार बना है, लेकिन मान प्रकार int के लिए बहुत बड़ी है। आप एक प्रत्यय का उपयोग करने के शाब्दिक का प्रकार बदलने के लिए है, यानी

long long num3 = 100000000000LL; 

प्रत्यय LL प्रकार long long में शाब्दिक बनाता है की जरूरत है। सी बाईं ओर के प्रकार से इसे निष्कर्ष निकालने के लिए पर्याप्त "स्मार्ट" नहीं है, प्रकार शाब्दिक की एक संपत्ति है, न कि जिस संदर्भ में इसका उपयोग किया जा रहा है।

+42

जब यह उत्तर लिखा गया था तो यह संभवतः सही था, लेकिन अब सी ++ मानक कहता है कि बिना पूर्णांक के पूर्णांक का प्रकार प्रत्यय 'int',' long int ', और' long long int 'का पहला है जिसमें इसका मूल्य प्रदर्शित किया जा सकता है। [सी ++ §2.14.2/2] इसलिए अब 'एलएल' प्रत्यय को एक पूर्णांक अक्षर पर जोड़ने की आवश्यकता नहीं है जो कि अन्य प्रकारों के लिए बहुत बड़ा है। – bames53

+8

कारण यह था कि इससे पहले कोई समस्या नहीं थी क्योंकि सी ++ 'स्मार्ट' नहीं था, जिसे आवंटित किए जा रहे चर के प्रकार से शाब्दिक प्रकार निर्धारित करने के लिए पर्याप्त नहीं था, यह केवल इसलिए होता क्योंकि संकलक विस्तार विस्तारित नहीं किया गया था पूर्णांक प्रकार जैसे कि यह मानक भाषा के साथ अच्छी तरह से काम करेगा। सी ++ में अब नियम हैं कि किसी भी विस्तारित पूर्णांक प्रकार मानक के साथ बेहतर एकीकृत होंगे: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988।पीडीएफ – bames53

+4

@unwind मुझे लगता है कि उत्तर इन सुझावों के अनुसार संपादित किया जाना चाहिए। – Antonio

25

प्रयास करें:

num3 = 100000000000LL; 

और btw, C++ यह एक संकलक विस्तार है, मानक लंबे परिभाषित नहीं करता है, C99 का हिस्सा thats।

+10

खैर, सी ++ 11 अब लंबे समय तक परिभाषित करता है –

1

अपने कोड यहाँ (ठीक भी है कि लाइन uncommented साथ संकलित करता है।

num3 = 100000000000000000000; 

लिए इसे बदलने के लिए चेतावनी हो रही शुरू करने के लिए किया था।

+0

क्या कंपाइलर? सी ++ में, एक पूर्णांक शाब्दिक छोटा या लंबा छोटा होता है जो यह फिट बैठता है। सी 99 में, यह int, लंबा, लंबा लंबा होता है। तो जब गैर-मानक विस्तार के रूप में सी ++ पर लंबे समय तक बोल्ट करते हैं, तो शायद आपके कंपाइलर ने अक्षर के लिए सी 99 नियम भी अपनाए हैं। 64 बिट लिनक्स सिस्टम पर –

+0

जीसीसी संस्करण 4.3.2 (डेबियन 4.3.2-1.1)। –

+0

ओह, वैसे भी 64 बिट लंबा है, है ना? समझ में आता है। –

3

यह क्या मोड आप संकलन कर रहे हैं में निर्भर करता है। लंबे समय से लंबा है सी ++ मानक का हिस्सा नहीं है, लेकिन केवल (आमतौर पर) विस्तार के रूप में समर्थित है। यह अक्षर के प्रकार को प्रभावित करता है। किसी भी प्रत्यय के बिना दशमलव पूर्णांक अक्षर हमेशा int टाइप करते हैं यदि int पर्याप्त संख्या संख्या का प्रतिनिधित्व करने के लिए पर्याप्त है। परिणाम लंबे समय तक बहुत बड़ा है जिसके परिणामस्वरूप कार्यान्वयन-परिभाषित किया गया है (पी मजबूती से केवल कई प्रकार के लंबे int को पिछड़ा संगतता के लिए छोटा कर दिया गया है)। इस मामले में आपको लंबे समय तक विस्तार (अधिकांश कंपाइलरों पर) सक्षम करने के लिए एलएल प्रत्यय का स्पष्ट रूप से उपयोग करना होगा।

अगले सी ++ संस्करण आधिकारिक तौर पर एक तरीका है कि आप किसी भी प्रत्यय की जरूरत नहीं होगी में लंबे समर्थन जब तक आप स्पष्ट बल शाब्दिक के प्रकार कम से कम लंबा लंबा होना चाहते हैं। यदि संख्या लंबे समय तक प्रदर्शित नहीं की जा सकती है तो संकलक स्वचालित रूप से एलएल प्रत्यय के बिना भी लंबे समय तक उपयोग करने की कोशिश करेगा। मेरा मानना ​​है कि यह सी 99 का व्यवहार भी है।

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