2016-05-19 9 views
6

यहाँ "अभिव्यक्ति में अतिप्रवाह" मेरे कोडजीसीसी बराबर बराबर अभिव्यक्ति काम करता है, जबकि ठीक

#include <iostream> 
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 
static const unsigned long long int y = 36 * 36 * 36 * 36; 
static const unsigned long long int yy = y * y; 

int main() 
{ 
    std::cout << xx << std::endl; 
    std::cout << yy << std::endl; 
    return 0; 
} 

इस संकलन उत्पादन

# g++ -std=c++11 test.cpp -o test 
test.cpp:2:62: warning: integer overflow in expression [-Woverflow] 
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

है यह निष्पादन उत्पादन होता है

# ./test 
18446744073025945600 
2821109907456 

कर सकते हैं आप समझाते हैं कि मैं यह चेतावनी और अलग-अलग परिणाम क्यों देखूं? अगर 36 चार में फिट हो सकता है तो 36^8 बिना हस्ताक्षर किए लंबे लंबे int में फिट हो सकता है, इसलिए मुझे यकीन नहीं है कि यहां क्या समस्या है, कृपया सलाह दें।

+0

यह एक बहुत ही आम गलतफहमी प्रतीत होता है: यह बाद का इरादा किसी भी तरह के पहले कोड के अर्थ को प्रभावित करता है। (जहां "पहले" और "बाद में" उप-अभिव्यक्ति समावेशन ऑर्डरिंग का संदर्भ लें।) आमतौर पर यह सी ++ में मामला नहीं है; सबसे प्रभावशाली आप इस तरह के प्रभाव के लिए मिलता है जैसे कि एक कलाकार के अंदर पते के संचालन पर ओवरलोड रिज़ॉल्यूशन है। –

उत्तर

10
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

36 (मैं जीसीसी 4.9.2 का उपयोग कर रहा) int

36 * 36 टाइप किया है टाइप int

(36 * 36 * 36 * 36) है टाइप int

(36 * 36 * 36 * 36) * (36 * 36 * 36 * 36) है टाइप int और अतिप्रवाह , जो वास्तव में हस्ताक्षरित प्रकारों के लिए अपरिभाषित व्यवहार है।

आप शायद

static const unsigned long long int xx = (36ull * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

चाहता था दूसरे मामले का सवाल है:

static const unsigned long long int yy = y * y; 

y टाइप unsigned long long

y * y टाइप unsigned long long इसलिए कोई अतिप्रवाह है है है।

+1

टाइपो - हस्ताक्षरित प्रकारों के लिए अपरिभाषित व्यवहार - आपका मतलब हस्ताक्षर किया गया, है ना? – Rostislav

+0

@ रोस्टिस्लाव अहम ... धन्यवाद: डी – user657267

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