दूसरे दिन, I came across इस संरचना: कुछ उदाहरण सी ++ कोड मेंकैसे पोर्टेबल एक हस्ताक्षरित प्रकार के लिए -1 कास्टिंग कर रहा है?
static_cast<size_type>(-1)
है, जो (जहां size_type
से है के विवरण के आधार पर) निम्नलिखित सी के बराबर होने की संभावना है:
(size_t)(-1)
जैसा कि मैं इसे समझता हूं, यह इस तथ्य के आधार पर काम करता है कि दो में से 1 का प्रतिनिधित्व अंकगणितीय 11111...1
है, जो आपके पास जितने बिट्स हैं, इसलिए यह अधिकतम मूल्य प्राप्त करने का एक त्वरित तरीका है जैसे एक हस्ताक्षरित प्रकार size_t
पकड़ सकता है। हालांकि, मेरी समझ यह भी है कि सी गारंटी नहीं देता है कि जुड़वां पूरक का उपयोग किया जाएगा; यदि सी कार्यान्वयन किसी के पूरक का उपयोग करता है, तो यह अधिकतम मूल्य से 1 कम होगा, और यदि यह हस्ताक्षरित परिमाण का उपयोग कर रहा है, तो यह अधिकतम मूल्य से अधिक आधा होगा।
क्या कोई झुर्रियां है जो मुझे याद आ रही है कि यह बीमा करता है कि यह हस्ताक्षरित पूर्णांक के प्रतिनिधित्व के बावजूद सही काम करता है? क्या यह सी और सी ++ के बीच भिन्न है (कई आश्चर्यजनक चीजें करते हैं)?
यदि आप सुनिश्चित करना चाहते हैं, तो हमेशा 'std :: numeric_limits :: अधिकतम()' है। –
UncleBens
मुझे लगता है कि इस तरह की स्थितियां हैं कि आपके पास static_cast और भाषा में reinterpret_cast है - static_cast आपको कुछ अनुमानित (और इस प्रकार उपयोगी) दे सकता है, लेकिन कुछ प्लेटफ़ॉर्म पर धीमे कार्यान्वयन हो सकते हैं, जबकि reinterpret_cast किसी भी गारंटी के साथ दूर हो सकता है। – Kylotan
यह आईएमएचओ सभी एक बिट्स प्राप्त करने का सबसे अच्छा तरीका है।'~ 0U' का उपयोग करने वाले विकल्प भी (और यदि आप 'यू' जोड़ना चाहते हैं और' 0 0 'करते हैं तो आप उदाहरण के लिए सभी बिट्स 0 के साथ समाप्त कर सकते हैं) - लेकिन' हस्ताक्षर 'प्रकार पर' -1' कास्ट का उपयोग करके , यह हमेशा प्रकार से स्वतंत्र काम करता है। तो आपको 'यूएलएल' का उपयोग करने या पहले 'हस्ताक्षरित शॉर्ट' पर कास्ट करने की परवाह नहीं है - आप केवल '-1' का उपयोग कर सकते हैं और इसे असाइन कर सकते हैं :) यह भी देखें http://stackoverflow.com/questions/809227/ यह-सुरक्षित-से-उपयोग-1-टू-सेट-ऑल-बिट्स-टू-सच्चा –