2010-05-03 14 views
15

के लिए सी व्यवहार के बारे में प्रश्न मैंने कई स्थानों पर पढ़ा है कि पूर्णांक ओवरफ्लो हस्ताक्षरित समकक्ष के विपरीत सी में अच्छी तरह परिभाषित है।हस्ताक्षर किए गए पूर्णांक अंडरफ़्लो

समान है?

उदाहरण के लिए:

unsigned int x = -1; // Does x == UINT_MAX? 

धन्यवाद।

मुझे याद नहीं है, लेकिन मैंने कहीं पढ़ा है कि हस्ताक्षर किए गए अभिन्न प्रकारों पर अंकगणित मॉड्यूलर है, इसलिए यदि यह मामला था तो -1 == UINT_MAX mod (UINT_MAX + 1)।

+2

मेरा मानना ​​है कि "अंडरफ्लो" शब्द केवल फ्लोटिंग पॉइंट नंबरों पर लागू होता है, जहां आप शून्य के बहुत करीब कुछ संख्याओं का प्रतिनिधित्व नहीं कर सकते हैं। इंटीग्रर्स के पास यह समस्या नहीं होगी। – WildCrustacean

+0

@bde मैं मानता हूं कि तकनीकी रूप से सटीक बयान है, लेकिन शब्द को अक्सर सिस्टम सिस्टम के निचले सिरे पर सीमा की स्थिति के उल्लंघन के लिए ओवरलोड किया जाता है। – vicatcu

उत्तर

22

§6.2.5, पैरा 9:

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

संपादित करें:

क्षमा करें, गलत संदर्भ है, लेकिन परिणाम अभी भी नीचे पिन किया गया है। सही संदर्भ §6.3.1.3 (पर हस्ताक्षर किए और अहस्ताक्षरित पूर्णांक रूपांतरण) है:

अगर नए प्रकार अहस्ताक्षरित है, मूल्य द्वारा बार-बार जोड़ने या अधिकतम मान से एक अधिक घटाकर बदल जाती है कि कर सकते हैं तक नए प्रकार में प्रदर्शित किया जाना चाहिए मान प्रकार की सीमा में है।

तो हाँ, x == UINT_MAX

+0

आपका संदर्भ ठीक है, लेकिन लागू नहीं है क्योंकि अभिव्यक्ति -1 में हस्ताक्षरित ऑपरेंड शामिल हैं, हस्ताक्षरित ऑपरेंड नहीं। –

+0

प्रश्न पहले से ही स्वीकार करता है कि अतिप्रवाह अच्छी तरह परिभाषित है। प्रश्न नकारात्मक संख्याओं के बारे में है, सकारात्मक नहीं। –

+0

@Doug, @Mark: प्रश्न हस्ताक्षर से हस्ताक्षरित पूर्णांक से रूपांतरणों के बारे में है, जिसे §6.3.1.3 द्वारा निर्दिष्ट किया गया है। –

4

-1, जब 2 के पूरक संख्या के रूप में व्यक्त किया जाता है, तो 0xFF की मात्रा होती है ... एफ आपके नंबर कितने बिट्स के लिए है। एक हस्ताक्षरित संख्या स्थान में मान जो अधिकतम मान संभव है (यानी सभी बिट सेट हैं)। इसलिए हाँ, एक्स == UINT_MAX। निम्नलिखित कोड एक सी 99 सख्त कंपाइलर पर "1" उत्सर्जित करता है:

#include <stdio.h> 
#include <stdint.h> 
#include <limits.h> 

int main(int argc, char **argv){ 
    uint32_t x = -1;  
    printf("%d", x == UINT_MAX ? 1 : 0); 
    return 0; 
} 
+1

मानक द्वारा आवश्यक दो-पूरक संख्याएं हैं? –

+4

नहीं, मानक द्वारा 2 एस पूरक की आवश्यकता नहीं है, इसलिए यह समाधान सामान्य नहीं है; मेरा जवाब देखें –

+1

यह आवश्यक नहीं है कि 'uint32_t' का अधिकतम मान' UINT_MAX' हो - 'UINT_MAX' 65535 जितना छोटा हो और' ULONG_MAX' जितना बड़ा हो। यदि आप 'uint32_t' को' हस्ताक्षरित 'में बदलते हैं तो यह सही होगा। – caf

-1

आप हस्ताक्षरित और हस्ताक्षरित संख्याओं को मिश्रित कर रहे हैं, जो अनकॉल है।

unsigned int x = 0u - 1u; // is OK though 
+3

यह अनकॉल हो सकता है या नहीं भी हो सकता है, लेकिन यह पूरी तरह से अच्छी तरह से परिभाषित मानक-अनुरूप है सी –

+0

@ स्टीफन कैनन, असत्य। -1 का bitwise प्रतिनिधित्व परिभाषित नहीं किया गया है। उदाहरण के लिए, यह पूरक हो सकता है। –

+0

@Stepen, "मानक-अनुरूप" शायद, लेकिन "अच्छी तरह से परिभाषित"? यह सवाल का क्रूक्स है। –

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