मैं भागा 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 को पहले कोड चलाने वाले डेटाटाइप के रूप में भी आजमाया।
क्या कोई इस व्यवहार को समझा सकता है? धन्यवाद!
@Eric, umm .. हाँ यह किया। पोस्ट में रखी चेतावनी का संदर्भ लें। क्यों संकलक स्वचालित रूप से अपग्रेड नहीं करता है ... मुझे नहीं पता। –
'एलएल 'की आवश्यकता नहीं होनी चाहिए। "एक [प्रत्यय रहित] पूर्णांक अक्षर का प्रकार [निम्न सूची] में पहला है जिसमें इसका मूल्य प्रदर्शित किया जा सकता है:' int', 'long int', 'long long int'।" (सी ++ 11 2.14.2/2 से; सी 99 में ऐसी भाषा है जो व्यावहारिक रूप से वही बात कहती है, और सी ++ 03 में एक ही भाषा है लेकिन इसमें 'लंबे समय तक int' शामिल नहीं है क्योंकि यह सी ++ 03 का हिस्सा नहीं था) । जबकि 'एलएल' जोड़ने का प्रस्तावित समाधान कुछ कंपाइलरों पर काम कर सकता है, इसकी आवश्यकता नहीं होनी चाहिए (विज़ुअल सी ++ 2010, जी ++ 4.5.1, और क्लैंग 3.0 सभी 'एलएल' के बिना कोड स्वीकार करते हैं)। –
@ जेम्स, दिलचस्प। मुझे g ++ 4.4.3 पर चेतावनी मिलती है। शायद मुद्दा यह है कि ये कंपाइलर अभी तक सी ++ 11 संगत नहीं हैं? –