2014-07-08 10 views
6

मेरे पास एक प्रोजेक्ट है जहां मैं बड़ी संख्या (एनएस-टाइमस्टैम्प) से निपटता हूं जो पूर्णांक में फिट नहीं होता है। इसलिए मैं उदाहरण का उपयोग करना चाहता हूँ int64_t और वर्तमान में एक टेस्ट केस लिख रहा हूं (हाँ!)।बड़े पूर्णांक मान की परिभाषा

बड़ी संख्या के लिए व्यवहार की जाँच करने के लिए, मैं

int64_t val = 2*std::numeric_limits<int>::max(); 
qDebug() << "long val" << val; 

जो

long val -2 

(एक ही रूप में यदि मैं पूर्णांक के रूप में वैल को परिभाषित) रिटर्न की तरह कुछ के साथ शुरू कर दिया।

लेकिन अगर मैं

int64_t val = std::numeric_limits<int>::max(); 
val *= 2; 
qDebug() << "long val" << val; 

बारे में मैं

long val 4294967294 

जो सही लगती है मिलता है।

तो मेरे लिए ऐसा लगता है कि 2*max() पहले पूर्णांक में संग्रहीत है (इस चरण में छंटनी हुई) और फिर int64 पर कॉपी की गई। ऐसा क्यों होता है? संकलक जानता है कि परिणाम int64 प्रकार है ताकि 2*max() सीधे फिट हो।

उत्तर

5

इसलिए मेरे लिए यह रूप में अगर 2*max() पहले एक पूर्णांक में संग्रहित है (इस चरण में छोटा कर दिया है) और फिर int64

में कॉपी किया यह बिल्कुल सही है लग रहा है। भाषा विनिर्देश के अनुसार, जब अभिव्यक्ति के सभी भाग int में फिट होते हैं, तो गणना पूर्णांक में की जाती है। आपके मामले में, 2 और max() दोनों int में फिट होते हैं, इसलिए गुणा पूर्णांक में किया जाता है, जिससे अतिप्रवाह होता है।

संकलक जानता है कि परिणाम प्रकार int64 की है ताकि यह 2*max() सीधे फिट चाहिए।

जिसके परिणामस्वरूप एक अभिव्यक्ति सौंपा गया है, इस स्थिति में कोई फर्क नहीं पड़ता: अभिव्यक्ति स्वयं की गणना के तरीके को निर्देशित करती है। आप max() से int64:

int64_t val = 2*(int64_t)std::numeric_limits<int>::max(); 
कास्टिंग करके एक ही परिणाम प्राप्त कर सकते हैं
संबंधित मुद्दे