2016-11-15 11 views
5

जब मैं string::npos पर काम कर रहा था, मैंने कुछ देखा और मुझे वेब पर इसके लिए कोई स्पष्टीकरण नहीं मिला।क्यों है (18446744073709551615 == -1) सच है?

(string::npos == ULONG_MAX) 

और

(string::npos == -1) 

सही हैं।

(18446744073709551615 == -1) 

जो भी सच है:

तो मैं इस कोशिश की।

यह कैसे संभव हो सकता है? क्या यह बाइनरी वार्तालाप की वजह से है?

+3

अतिप्रवाह के लिए लागू होता है: p आप तुलना एक अहस्ताक्षरित और एक हस्ताक्षरित मूल्य – Stargateur

+3

इस अपरिभाषित व्यवहार नहीं है । – rubenvb

+1

18446744073709551615 = 2^64 -1 ...डरावना संयोग? – lelloman

उत्तर

5

string::npos को constexpr static std::string::size_type string::npos = -1; के रूप में परिभाषित किया गया है (या यदि यह कक्षा परिभाषा के अंदर परिभाषित किया गया है जो constexpr static size_type npos = -1; होगा लेकिन यह वास्तव में अप्रासंगिक है)।

असंबद्ध प्रकारों में परिवर्तित नकारात्मक संख्याओं का रैपराउंड (std::string::size_type मूल रूप से std::size_t है, जो हस्ताक्षरित है) मानक द्वारा पूरी तरह से परिभाषित किया गया है। -1 हस्ताक्षरित प्रकार के सबसे बड़े प्रतिनिधित्व योग्य मूल्य पर लपेटता है, जो आपके मामले में 18446744073709551615 है। ध्यान दें कि सटीक मान कार्यान्वयन-परिभाषित है क्योंकि std::size_t का आकार क्रियान्वयन-परिभाषित है (लेकिन सिस्टम में सबसे बड़ी संभव सरणी के आकार को पकड़ने में सक्षम)।

1

सी ++ स्टैंडर्ड (दस्तावेज़ संख्या: N3337 या दस्तावेज़ संख्या: N4296) के अनुसार std::string::npos निम्नलिखित तरीके

static const size_type npos = -1; 

जहां std :: स्ट्रिंग :: size_type कुछ अहस्ताक्षरित पूर्णांक प्रकार है परिभाषित किया गया है। तो कुछ भी अद्भुत नहीं है कि std :: string :: npos बराबर -1 है। प्रारंभकर्ता को std::string::npos के tyhpe में परिवर्तित किया जाता है।

इस समीकरण

(string::npos == ULONG_MAX) is true, 

का सवाल है तो इसका मतलब है कि प्रकार std::string::npos इस्तेमाल किया कार्यान्वयन unsigned long में टाइप किया है। यह प्रकार आमतौर पर size_t प्रकार से मेल खाता है।

इस समीकरण

(18446744073709551615 == -1) 

बाईं शाब्दिक में कुछ अहस्ताक्षरित अभिन्न प्रकार है कि इतनी बड़ी शाब्दिक स्टोर करने के लिए उपयुक्त है। इस प्रकार सही ऑपरेंड को साइन बिट को प्रोपेट करके इस हस्ताक्षरित प्रकार में भी परिवर्तित किया जाता है। चूंकि बाएं ऑपरेंड स्वयं को प्रकार का अधिकतम मान दर्शाता है तो वे बराबर होते हैं।

0

यह सब हस्ताक्षरित ओवरफ्लो और तथ्य यह है कि ऋणात्मक संख्या 2 एस पूरक के रूप में संग्रहीत की जाती है। इसका मतलब है कि ऋणात्मक संख्या का पूर्ण मूल्य प्राप्त करने के लिए, आप सभी बिट्स को उलटा करते हैं और एक जोड़ते हैं। मतलब जब एक 8 बिट तुलना 255 कर रहे हैं और -1 11111111. का एक ही बाइनरी मान ही बड़ा पूर्णांक

https://en.m.wikipedia.org/wiki/Two%27s_complement

+0

नकारात्मक संख्या परिभाषा/मानक द्वारा 2 एस पूरक के रूप में संग्रहित नहीं हैं। वे केवल उस तरह से व्यवहार करते हैं। – rubenvb

+0

यहां कोई हस्ताक्षरित ओवरफ़्लो नहीं है। –

+0

यह सीपीयू आर्किटेक्चर निर्भर है लेकिन अधिकांश आधुनिक आर्किटेक्ट्स 2 एस पूरक – doron

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