2011-09-12 19 views
8

मैं भागा Windows XP पर कोड के दो टुकड़े निम्नलिखित (कोड: ब्लॉक, MinGW), और Ubuntu (11.04, जी ++)पकड़े 2^63 -1 लंबे

मैं मुसीबत निम्नलिखित कोड

चल रहा है
#include <iostream> 

using namespace std; 

int main(){ 

    long long a = 9223372036854775807; 
    cout << a; 
    return 0; 

} 

वह संख्या 2^63 -1 है। अगर मैं इस कोड को चलाने यह संकलित अब, लेकिन इस सवाल का जवाब retunred 9223372036854775808, नोटिस अंत में 8 ....

, का उपयोग कर -

C:\Documents and Settings\JohnWong\My Documents\codeblock\343_hw_1\main.cpp|9|error: integer constant is too large for "long" type|

Ubuntu पर: लेकिन मैं एक त्रुटि बताते हुए मिल जाएगा पावर फ़ंक्शन, मैं ठीक हूँ।

#include <iostream> 
#include <iomanip> 
#include <math.h> 
using namespace std; 

int main(){ 

    long long a = pow(2,64); 
    cout << "a: " << setprecision(20) << a << endl; 
    cout << "a-1: " << setprecision(20) << a-1 << endl; 
    cout << "a-2: " << setprecision(20) << a-2 << endl; 
    cout << "a+0: " << setprecision(20) << a+0 << endl; 
    cout << "a+1: " << setprecision(20) << a+1 << endl; 
    cout << "a+2: " << setprecision(20) << a+2 << endl; 
    cout << "a+3: " << setprecision(20) << a+3 << endl; 

    return 0; 
} 

मुझे वह मान मिलेगा जो मुझे चाहिए (+1 से कुछ भी ओवरफ्लो का कारण बन जाएगा, ठीक है)।

उबंटू पर आउटपुट समान दिखता है। अच्छा।

तो यहां क्या हो रहा है? निरंतर क्यों अच्छा नहीं है ??? मैंने intmax_t और int64_t को पहले कोड चलाने वाले डेटाटाइप के रूप में भी आजमाया।

क्या कोई इस व्यवहार को समझा सकता है? धन्यवाद!

उत्तर

13
long long a = 9223372036854775807LL; 

एलएल शाब्दिक लंबे समय तक शाब्दिक बनाता है। अन्यथा शाब्दिक चूक एक लंबे शाब्दिक होने के लिए और फिर एक में संग्रहीत होने से पहले लंबे समय तक जाली जाती है।

+0

@Eric, umm .. हाँ यह किया। पोस्ट में रखी चेतावनी का संदर्भ लें। क्यों संकलक स्वचालित रूप से अपग्रेड नहीं करता है ... मुझे नहीं पता। –

+0

'एलएल 'की आवश्यकता नहीं होनी चाहिए। "एक [प्रत्यय रहित] पूर्णांक अक्षर का प्रकार [निम्न सूची] में पहला है जिसमें इसका मूल्य प्रदर्शित किया जा सकता है:' int', 'long int', 'long long int'।" (सी ++ 11 2.14.2/2 से; सी 99 में ऐसी भाषा है जो व्यावहारिक रूप से वही बात कहती है, और सी ++ 03 में एक ही भाषा है लेकिन इसमें 'लंबे समय तक int' शामिल नहीं है क्योंकि यह सी ++ 03 का हिस्सा नहीं था) । जबकि 'एलएल' जोड़ने का प्रस्तावित समाधान कुछ कंपाइलरों पर काम कर सकता है, इसकी आवश्यकता नहीं होनी चाहिए (विज़ुअल सी ++ 2010, जी ++ 4.5.1, और क्लैंग 3.0 सभी 'एलएल' के बिना कोड स्वीकार करते हैं)। –

+1

@ जेम्स, दिलचस्प। मुझे g ++ 4.4.3 पर चेतावनी मिलती है। शायद मुद्दा यह है कि ये कंपाइलर अभी तक सी ++ 11 संगत नहीं हैं? –

2

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

+0

@ सी ++ 11। हाँ यह सही है। धन्यवाद! – CppLearner

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