दिलचस्प पोस्ट
Matplotlib – प्रत्येक बिन लेबल एक नेस्टेड क्लास टेम्प्लेट का आंशिक स्पेशलाइजेशन क्यों अनुमत है, जबकि पूरा नहीं है? पीएल / एसक्यूएल में एक अद्यतन से प्रभावित पंक्तियों की संख्या कस्टम सूची दृश्य में संपर्क संख्या और संपर्क नाम प्रदर्शित करना जब अजगर जेनरेटर का उपयोग करने का अच्छा समय नहीं है? कैसे एक std :: vector फेरबदल? जीसीसी के साथ सी ++ प्रोग्राम संकलित करना कमांड लाइन से VBScript का उपयोग कर Excel से बाहर Excel मैक्रो चलाएं यूनिट परीक्षण में दो वस्तुओं की तुलना कैसे करें? स्विफ्ट में सादा पाठ को एचटीएमएल में कनवर्ट करें स्थिर const vs #define SqLite में शीर्ष 5 रिकॉर्ड कैसे प्राप्त करें? सी में एक समारोह के अंदर स्थिर चर अंदर ListView: LinkMovementMethod के साथ TextView सूची आइटम unclickable बनाता है? जावा में, मैं बाइनरी प्रारूप में एक पूर्णांक स्थिरता को परिभाषित कर सकता हूँ?

(-2147483648> 0) सी ++ में सही देता है?

-2147483648 32 बिट्स के साथ पूर्णांक प्रकार के लिए सबसे छोटी पूर्णांक है, लेकिन ऐसा लगता है कि यह if(...) वाक्य में अतिप्रवाह होगा:

 if (-2147483648 > 0) std::cout << "true"; else std::cout << "false"; 

यह मेरे परीक्षण में true प्रिंट होगा हालांकि, यदि हमने पूर्णांक में 2147483648 डाली, तो परिणाम अलग होगा:

 if (int(-2147483648) > 0) std::cout << "true"; else std::cout << "false"; 

यह false प्रिंट करेगा।

मैं उलझन में हूं। क्या कोई इस पर स्पष्टीकरण दे सकता है?


अपडेट 02-05-2012:

आपकी टिप्पणियों के लिए धन्यवाद, मेरे कंपाइलर में, इंट का आकार 4 बाइट्स है। मैं कुछ सरल परीक्षण के लिए वीसी का उपयोग कर रहा हूँ मैंने अपने प्रश्न में विवरण बदल दिया है

इस पोस्ट में बहुत अच्छी प्रतिक्रियाएं हैं , एंड्रयूटी ने इस तरह के इनपुट पर संकलक को कैसे व्यवहार किया जाएगा, और यह न्यूनतम पूर्णांक कैसे लागू किया गया, इस पर बहुत विस्तृत विवरण दिया था। दूसरी तरफ qPCR4vir ने कुछ संबंधित " कुतर्क " और कितने पूर्णांक का प्रतिनिधित्व किया। कितना प्रभावशील है!

Solutions Collecting From Web of "(-2147483648> 0) सी ++ में सही देता है?"

-2147483648 एक "संख्या" नहीं है सी ++ भाषा नकारात्मक शाब्दिक मूल्यों का समर्थन नहीं करती है

-2147483648 वास्तव में एक अभिव्यक्ति है: एक सकारात्मक शब्द 2147483648 मूल्य के साथ unary - इसके सामने ऑपरेटर। मान 2147483648 जाहिरा तौर पर अपने मंच पर int सीमा के सकारात्मक पक्ष के लिए बहुत बड़ा है। यदि प्रकार long int आपके प्लेटफ़ॉर्म पर अधिक से अधिक रेंज के होते हैं, तो संकलक को स्वचालित रूप से मान लेना होगा कि 2147483648 long int प्रकार हैं। (सी +11 11 में कंपाइलर को भी long long int -2147483648 प्रकार पर विचार करना होगा।) इस प्रकार संकलक को बड़े प्रकार के डोमेन में -2147483648 का मूल्यांकन करने -2147483648 और परिणाम नकारात्मक होगा, जैसा कि एक की अपेक्षा होगी

हालांकि, जाहिरा तौर पर आपके मामले में, long int की श्रेणी में int सीमा होती है, और सामान्य तौर पर आपके प्लेटफ़ॉर्म पर int की तुलना में अधिक से अधिक श्रेणी के साथ पूर्णांक प्रकार नहीं होता है। इसका औपचारिक रूप से मतलब है कि सकारात्मक निरंतर 2147483648 सभी उपलब्ध हस्ताक्षरित पूर्णांक प्रकारों को ओवरफ्लो करता है, जिसका बदले में इसका अर्थ है कि आपके प्रोग्राम का व्यवहार अपरिभाषित है। (यह थोड़ा अजीब है कि भाषा विनिर्देश ऐसे मामलों में अपरिभाषित व्यवहार के लिए विकल्प चुनता है, बजाय नैदानिक ​​संदेश की आवश्यकता होती है, लेकिन यह वैसे ही होता है।)

व्यवहार में, यह ध्यान में रखते हुए कि व्यवहार अपरिभाषित है, 2147483648 को कुछ क्रियान्वयन-निर्भर नकारात्मक मान के रूप में व्याख्या की जा सकती है जो कि एक-दूसरे के बाद सकारात्मक चालू होता है - आवेदन वैकल्पिक रूप से, कुछ कार्यान्वयन मूल्य का प्रतिनिधित्व करने के लिए अहस्ताक्षरित प्रकारों का उपयोग करने का निर्णय ले सकता है (उदाहरण के लिए, C89 / 90 कंपाइलर्स में unsigned long int का उपयोग करने के लिए आवश्यक थे, लेकिन C99 या C ++ में नहीं)। क्रियान्वयन को कुछ भी करने की अनुमति है, क्योंकि व्यवहार वैसे भी अनिर्धारित है।

एक तरफ ध्यान दें के रूप में, यह कारण है कि INT_MIN जैसे INT_MIN को आम तौर पर परिभाषित किया जाता है

 #define INT_MIN (-2147483647 - 1) 

प्रतीत होता है और अधिक सीधा के बजाय

 #define INT_MIN -2147483648 

उत्तरार्द्ध उद्देश्य के रूप में काम नहीं करेगा

संकलक (वीसी2012) "न्यूनतम" पूर्णांक को बढ़ावा देता है जो मूल्यों को पकड़ सकता है पहले मामले में, signed int (और long int ) हस्ताक्षर करने से पहले (हस्ताक्षर लागू करने से पहले) नहीं हो सकता, लेकिन unsigned int कर सकते हैं: 2147483648 है unsigned int ???? प्रकार। दूसरे में आप unsigned से int को बल देते हैं।

 const bool i= (-2147483648 > 0) ; // --> true 

चेतावनी C4146: एक बेस्ड माइनस ऑपरेटर अहस्ताक्षरित प्रकार पर लागू होता है, परिणाम अभी भी अहस्ताक्षरित नहीं है

यहां संबंधित "कुतूहल" हैं:

 const bool b= (-2147483647 > 0) ; // false const bool i= (-2147483648 > 0) ; // true : result still unsigned const bool c= ( INT_MIN-1 > 0) ; // true :'-' int constant overflow const bool f= ( 2147483647 > 0) ; // true const bool g= ( 2147483648 > 0) ; // true const bool d= ( INT_MAX+1 > 0) ; // false:'+' int constant overflow const bool j= ( int(-2147483648)> 0) ; // false : const bool h= ( int(2147483648) > 0) ; // false const bool m= (-2147483648L > 0) ; // true const bool o= (-2147483648LL > 0) ; // false 

सी ++ 11 मानक :

2.14.2 पूर्णांक शब्दशः [लेक्स.कॉन]

एक पूर्णांक शाब्दिक अंक का एक अनुक्रम होता है जिसमें कोई अवधि या घातांक भाग नहीं होता है। एक पूर्णांक शब्दशः एक उपसर्ग हो सकता है जो इसके आधार और एक प्रत्यय निर्दिष्ट करता है जो इसके प्रकार को निर्दिष्ट करता है।

एक पूर्णांक शाब्दिक का प्रकार इसी सूची में से पहला है जिसमें इसका मान प्रदर्शित किया जा सकता है।

यहां छवि विवरण दर्ज करें

यदि कोई पूर्णांक शाब्दिक अपनी सूची में किसी भी प्रकार से प्रतिनिधित्व नहीं किया जा सकता है और एक विस्तारित पूर्णांक प्रकार (3. 9 .1) उसके मूल्य का प्रतिनिधित्व कर सकता है, तो उसमें विस्तारित पूर्णांक प्रकार हो सकता है। यदि शाब्दिक सूची में सभी प्रकार के हस्ताक्षर किए गए हैं, तो विस्तारित पूर्णांक प्रकार पर हस्ताक्षर किए जाएंगे। यदि शाब्दिक सूची में सभी प्रकार के अहस्ताक्षरित हैं, तो विस्तारित पूर्णांक प्रकार अहस्ताक्षरित नहीं होगा। यदि सूची में हस्ताक्षरित और अहस्ताक्षरित दोनों प्रकार हैं, तो विस्तारित पूर्णांक प्रकार हस्ताक्षरित या हस्ताक्षरित हो सकता है। एक प्रोग्राम खराब है अगर इसके अनुवाद इकाइयों में से कोई एक पूर्णांक शाब्दिक होता है जिसे किसी भी प्रकार की अनुमतियों का प्रतिनिधित्व नहीं किया जा सकता है।

और ये मानक में पूर्णांक के लिए प्रचार नियम हैं।

4.5 अभिन्न प्रचार [conv.prom]

char16_t , char32_t char16_t , char32_t , या वॉचर_टी के अलावा एक पूर्णांक प्रकार का एक char16_t , जिसका पूर्णांक रूपांतरण रैंक (4.13) इंटरेड रैंक से कम है, उसे पूर्णांक के रूप में परिवर्तित किया जा सकता है यदि int स्रोत प्रकार के सभी मानों का प्रतिनिधित्व कर सकता है ; अन्यथा, स्रोत प्राइवल को प्रकार unsigned int प्राइव्यू में परिवर्तित किया जा सकता है

शॉर्ट में, 2147483648 ओवरफ्लो टू -2147483648 , और (-(-2147483648) > 0) true

यह कैसे है 2147483648 बाइनरी में दिखता है

इसके अतिरिक्त, हस्ताक्षरित द्विआधारी गणना के मामले में, सबसे महत्वपूर्ण बिट ("एमएसबी") चिन्ह बिट है। यह सवाल क्यों समझा सकता है कि क्यों

क्योंकि -2147483648 वास्तव में 2147483648 जिस पर अस्वीकृति ( - ) लागू होती है, संख्या वह नहीं है जो आपको अपेक्षा थी। यह वास्तव में इस छद्मकोण के बराबर है: operator -(2147483648)

अब, आपके कम्पाइलर को मान लें कि 4 बराबर sizeof(int) और CHAR_BIT को 8 रूप में परिभाषित किया गया है, जो कि 2147483648 को एक पूर्णांक ( 2147483647 ) के अधिकतम हस्ताक्षरित मूल्य को CHAR_BIT देगा। तो अधिकतम प्लस एक क्या है? 4 बिट के साथ काम करने देता है, 2 से पूर्णांक पूर्णांक देता है

रुकिए! 8 पूर्णांक को पूर्णांक देता है! हम क्या करें? 1000 अपने अहस्ताक्षरित प्रतिनिधित्व का उपयोग करें और एक हस्ताक्षरित पूर्णांक के रूप में बिट्स की व्याख्या करें। यह प्रतिनिधित्व हमें -8 साथ छोड़ देता है, जो 8 परिणामस्वरूप 2s पूरक प्रतिषेध लागू करता है, जो कि हम सभी जानते हैं, 0 से अधिक है।

यही कारण है कि <limits.h> (और <climits> ) आमतौर पर INT_MIN को परिभाषित INT_MIN ((-2147483647) - 1) – ताकि अधिकतम हस्ताक्षरित पूर्णांक ( 0x7FFFFFFF ) को नकार दिया गया ( 0x80000001 ), तब घटाया गया ( 0x80000000 )।