2013-02-15 13 views
10

UINT_MAX + 1u के लिए सी में परिभाषित व्यवहार क्या है? यह मानना ​​कितना सुरक्षित है कि यह शून्य है?UINT_MAX + 1 क्या बराबर है?

+3

@JoshPetitt : यह अभी भी शून्य से शून्य है। 'UINT_MAX + 1u' का मूल्यांकन एक हस्ताक्षरित पूर्णांक के रूप में किया जाता है, जिसके परिणामस्वरूप' 0' होता है, जिसे तब 'लंबे समय तक' में संग्रहीत किया जाता है। ;-) – netcoder

+0

@netcoder, मेरी विंडोज 64-बिट मशीन पर आप वास्तव में सही हैं। मेरा आंतरिक कंपाइलर दोषपूर्ण है। :-) –

उत्तर

21

मानक से (सी 11, 6.2.5/9, जोर मेरा):

[...] एक अभिकलन अहस्ताक्षरित ऑपरेंड को शामिल कर सकते हैं कभी नहीं अतिप्रवाह, क्योंकि एक परिणाम है कि द्वारा प्रतिनिधित्व नहीं किया जा सकता परिणामस्वरूप हस्ताक्षरित पूर्णांक प्रकार कम मॉड्यूलो संख्या है जो हो सकता है जो परिणामी प्रकार द्वारा दर्शाया गया सबसे बड़ा मान से अधिक है।

तो UINT_MAX10 है:

(10 + 1) % (10 + 1) == 0 

तो, हाँ, यह सुरक्षित यह शून्य है ग्रहण करने के लिए है।

+9

मानक जनादेश जो 'UINT_MAX' (और अन्य हस्ताक्षरित पूर्णांक प्रकारों के अधिकतम मान)' 2^एन -1' है, जहां 'एन' प्रकार की चौड़ाई है, इसलिए 10 एक बुरा उदाहरण है (लेकिन यह ' मुझे अपवित्रता से रोकें)। –

+1

2^3.4594316186372973 - 1 – Vortico

+0

इसके अलावा, '(हस्ताक्षरित) -1 == UINT_MAX'; उत्तरार्द्ध प्रीप्रोसेसर स्थितियों में उपयोग किया जा सकता है, जबकि '(हस्ताक्षरित) -1' का केवल संकलक द्वारा मूल्यांकन किया जा सकता है। – Loic

5

यह सुरक्षित है। सी मानक गारंटी देता है कि हस्ताक्षर पूर्णांक अतिप्रवाह शून्य में लपेटने के परिणाम।

+2

और सी सख्ती से बोलते हुए, हस्ताक्षरित पूर्णांक कभी हस्ताक्षरित पूर्णांक ओवरफ़्लो ओवरफ़्लो नहीं करते हैं। – ouah

+0

@ouah इस मामले में, मुझे क्या कहना चाहिए कि वे करते हैं? –

+1

@ एच 2CO3: आप कह सकते हैं कि वे चारों ओर लपेटते हैं। –

2

सुरक्षित होना चाहिए:

Wiki on unsigned overflow

नोट अहस्ताक्षरित पूर्णांक अतिप्रवाह अच्छी तरह से परिभाषित किया गया है।

इसके अलावा, यहां पर whole question है।

8

यह बल है कि जब अहस्ताक्षरित व्यवहार अच्छी तरह से परिभाषित किया गया है, पर हस्ताक्षर किए पूर्णांक अतिप्रवाह लायक है नहीं है: पूर्णांक

सी प्रोग्रामिंग भाषा में, पर हस्ताक्षर किए ओवरफ्लो अपरिभाषित व्यवहार का कारण बनता है, जबकि हस्ताक्षरित पूर्णांक ओवरफ़्लो संख्या को कम करने के लिए modu कम करता है लो विषय पर दो

एक बहुत अच्छा कागज के एक शक्ति: C/C++ पूर्णांक संचालन के

उदाहरण और उनके परिणामों

Expression    Result 
----------    ------ 
UINT_MAX+1    0 
LONG_MAX+1    undefined 
INT_MAX+1    undefined 
SHRT_MAX+1    SHRT_MAX+1 if INT_MAX>SHRT_MAX, otherwise undefined 
char c = CHAR_MAX; c++ varies 
-INT_MIN    undefined 
(char)INT_MAX   commonly -1 
1<<-1     undefined 
1<<0     1 
1<<31     commonly INT_MIN in ANSI C and C++98; undefined in C99 and C++11 
1<<32     undefined 
1/0     undefined 
INT_MIN%-1    undefined in C11, otherwise undefined in practice 
संबंधित मुद्दे