2011-04-04 14 views
5
signed long long value = -2147483648; 
    cout << ((signed long long)value); 

आउटपुट 2147483648 (कोई ऋण चिह्न नहीं), क्यों?INT_MIN के मान को लंबे समय तक

+0

क्या शीर्षक वास्तव में यह कहना चाहता है कि यह क्या करता है? – Mehrdad

+0

@ मेहरदाद: कोई बेहतर? –

+0

@Erik: ठीक है, INT_MIN है -2147483648 मेरे कार्यान्वयन पर। साइन-आयाम कार्यान्वयन पर, INT_MIN ठीक रहेगा (उदाहरण के लिए यदि यह -2147483647 है, तो 2147483647 एक int के रूप में प्रतिनिधित्व योग्य है), और INT_MIN-1 पहली संभावित समस्या होगी। –

उत्तर

8
signed long long value = -2147483648; 

2147483648 एक 32-बिट पर हस्ताक्षर किए पूर्णांक में नहीं दर्शाया जा सकता है, इसलिए यह हस्ताक्षर किए लंबा करने के लिए एक अहस्ताक्षरित, तो एकल शून्य से लागू किया जाता है (जो कुछ भी परिवर्तन नहीं करता है) में बदल जाती है, और फिर इसे असाइन किया गया है लंबा। -2147483648LL

+0

@ मिच: शाब्दिक लंबे समय तक हस्ताक्षरित नहीं है। चर है। – Erik

+0

@Erik: आह! ...... –

+0

@ एरिक हाँ यह एलएल (लंबे समय तक मुझे लगता है) के साथ काम करता है, क्या कोई साहित्यिक में कोई अन्य "पोस्टफिक्स" है? –

1

सी ++ में एक शाब्दिक पूर्णांक का प्रकार int है। यदि यह उस प्रकार में फिट नहीं है, तो इसे एक हस्ताक्षरित पूर्णांक के रूप में व्याख्या किया जा सकता है। हालांकि, यह गारंटी नहीं है कि इसे स्वचालित रूप से एक बड़े पूर्णांक प्रकार के रूप में माना जाएगा।

मानक, सौभाग्य से, शाब्दिक स्पष्ट प्रकार निर्दिष्ट करने के लिए एक प्रत्यय नोटेशन का समर्थन करते हैं।

इस मामले में, आपको -2147483648LL का उपयोग करना चाहिए।

+0

धन्यवाद, वास्तव में अच्छा स्पष्टीकरण +1 –

+0

"यह गारंटी नहीं है कि इसे स्वचालित रूप से एक बड़े पूर्णांक प्रकार के रूप में माना जाएगा।" - ठीक है, 2.13.1/2 गारंटी देता है कि इसे 'लंबे int' के रूप में माना जाएगा, लेकिन यह 'int' से बड़ा नहीं हो सकता है। –

+0

मानक सी ++ 0x तक 'एलएल' का समर्थन नहीं करता है। –

0

आपके मूल कोड में अपरिभाषित व्यवहार हो सकता है, लेकिन यह मुझे एक कंपाइलर बग की तरह दिखता है। जैसा कि अन्य ने इंगित किया है, निरंतर 2147483648 32 बिट int में प्रदर्शित नहीं किया जा सकता है। मानक के मुताबिक, "एक पूर्णांक का प्रकार शाब्दिक इसके फॉर्म, मान और प्रत्यय पर निर्भर करता है। यदि यह दशमलव है और कोई प्रत्यय नहीं है, तो इसमें इन प्रकारों में से पहला है जिसमें इसकी मान का प्रतिनिधित्व किया जा सकता है: int, long Int; यदि मान एक लंबे int के रूप में प्रतिनिधित्व नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है। " मसौदा सी ++ 0x इनके अंत में लंबे समय तक जोड़ता है।

यदि LONG_MAX 2147483648 से अधिक है, तो शाब्दिक का प्रकार लंबा है, और शून्य को सही मान देना चाहिए। अन्यथा, यदि संकलक पहले से ही लंबे समय तक समर्थन करता है (और के बाद से आप इस प्रकार के चर को घोषित कर रहे हैं, तो आपको यह मानना ​​चाहिए कि यह करता है), 2147483648 का प्रकार लंबा लंबा है, और घटा सही मान देना चाहिए । यदि संकलक लंबे समय तक समर्थन नहीं करता है, और लंबा केवल 32 बिट्स है, तो आपके कोड में अपरिभाषित व्यवहार है, इसलिए संकलक कुछ भी "सही" है।