2011-12-05 15 views
10

उदाहरण के लिएक्या -1u वैध सी ++ है?

size_t x = -1u; 

if (x == -1u) 
    ... 

मान्य है?

यदि यह मान्य है तो यह चेतावनी को रोक देगा। 32 बिट सिस्टम x पर निश्चित रूप से 0xffffffff होना चाहिए और 64 बिट सिस्टम पर यह 0xffffffffffffffff होना चाहिए।

-Jochen

+7

साहित्य हमेशा गैर-नकारात्मक होते हैं। इसे '- (1u)' के रूप में पार्स किया गया है। –

+0

@KerrekSB क्या इससे कोई फर्क पड़ता है? –

+0

ठीक है, यह परिणाम हस्ताक्षरित करता है, इसलिए यह यू – StilesCrisis

उत्तर

6

1u प्रकार unsigned int है। इसके बाद यूनरी - ऑपरेटर का उपयोग करके अस्वीकार कर दिया जाता है। व्यवहार इस प्रकार है:

एक अहस्ताक्षरित मात्रा के नकारात्मक से 2 n, जहां n पदोन्नत संकार्य में बिट्स की संख्या है अपने मूल्य को घटाकर की गणना की जाती है (सी ++ 11 5.3.1/8)।

-1u इस प्रकार unsigned int द्वारा आप सबसे बड़ा मान प्रदर्शनीय देने की गारंटी है।

मनमाने ढंग से हस्ताक्षरित प्रकार द्वारा प्रतिनिधित्व करने वाला सबसे बड़ा मूल्य प्राप्त करने के लिए, आप उस प्रकार के -1 को कास्ट कर सकते हैं। उदाहरण के लिए, std::size_t के लिए, static_cast<std::size_t>(-1) पर विचार करें।

0

हालांकि यह तकनीकी रूप से मान्य कोड है, तो आप कार्यान्वयन निर्भर व्यवहार पर निर्भर हैं: अहस्ताक्षरित के लिए एक नकारात्मक संख्या परिवर्तित करने की अतिप्रवाह हैंडलिंग। हालांकि, यदि आपको सार्थक 1 से तुलनात्मक रूप से तुलना करने की आवश्यकता है क्योंकि एपीआई कॉल का उपयोग करने के लिए आपको इसकी आवश्यकता होती है, तो सिस्टम पहले ही खराब हो चुका है लेकिन आपका कोड काम करने की संभावना है क्योंकि उन्हें दूसरी तरफ एक ही चीज़ करना पड़ता था एपीआई के।

+0

मैं एक सी ++ विशेषज्ञ नहीं हूं लेकिन मुझे संदेह है कि हस्ताक्षरित पूर्णांक प्रकार से हस्ताक्षर किए गए पूर्णांक प्रकार से कनवर्ट करना-सी ++ में परिभाषित किया गया है, क्योंकि इसे सी 99 में परिभाषित किया गया है। –

+0

यह अच्छी तरह से परिभाषित है। मुझे लगता है कि यह 32 बिट्स के लिए 'x% 2^32' जैसा कुछ है। – Pubby

+1

कोई नकारात्मक संख्या हस्ताक्षरित नहीं है। '1u' प्रकार की 'हस्ताक्षरित int' की सकारात्मक संख्या है, और यह कि असीमित' -' ऑपरेटर का उपयोग करके सकारात्मक संख्या को अस्वीकार कर दिया गया है। –

5

मैंने हमेशा "हस्ताक्षर किए गए, सभी बिट्स" के उद्देश्य के लिए ~ 0U का उपयोग किया है।

+4

... जो 64 बिट 'size_t' के लिए काम नहीं करेगा। –

+1

SIZE_MAX शायद उस मामले में बेहतर है, या ~ 0ULL फ़ॉलबैक के रूप में बेहतर है। – StilesCrisis

+0

हालांकि ध्यान रखना '~ 0' लिखना नहीं है। यहां 'यू' बहुत महत्वपूर्ण है। आगे की चर्चा के लिए, http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true –

1

कंपाइलर कार्यान्वयन निर्भर व्यवहार परेशान है। आप हालांकि, यह करने के लिए सक्षम होना चाहिए:

size_t x = 0; 
x--; 

if ((x+1) == 0) 
+0

यह अपरिभाषित व्यवहार है। वह कोड पोस्ट नहीं किया गया है। – Pubby

+0

@ पब्बी: इस जवाब में क्या आपको लगता है कि अपरिभाषित व्यवहार प्रदर्शित करता है? –

+1

पब्बी आप यूबी कहां देखते हैं? बिना हस्ताक्षर किए गए प्रकार (और size_t एक हस्ताक्षरित प्रकार है) ओवरफ्लो पर अच्छी तरह परिभाषित व्यवहार है, वे चारों ओर लपेटते हैं। (हस्ताक्षर अतिप्रवाह यूबी है)। – AProgrammer

0

यह संभावना है कि आप क्या चाहते:

size_t x = -1ull; 

if (x == -((size_t)-1ull)) 
    ... 

x सबसे बड़ा पूर्णांक संभव है, जो सभी बिट्स सेट नहीं किया जा सकता करने के लिए स्थापित किया जाएगा। इसके लिए ~ 0 का प्रयोग करें।

+0

अब से कई सालों में 'size_t'' हस्ताक्षरित लंबे समय तक 'से अधिक है,' size_t x = -1ull; '(शायद 'size_t' एक विस्तृत' uintmax_t' के लिए टाइप किए गए 'के रूप में' x' 'शुरू हो जाएगा अधिकतम मूल्य 'size_t x = SIZE_MAX;' अभी भी काम करेगा। – chux

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