2011-03-16 12 views
9

अगर मैं कुछ इस तरह करते हैं क्या होता है:क्या होता है जब मैं C++ में एक हस्ताक्षरित पूर्णांक से एक हस्ताक्षरित पूर्णांक घटाता हूं?

unsigned int u; 
int s; 

... 
s -= u; 

इस की अपेक्षित व्यवहार क्या है:

1) यह मानते हुए कि अहस्ताक्षरित पूर्णांक हस्ताक्षर किए पूर्णांक में से बहुत बड़ा नहीं है?

2) मान लीजिए कि हस्ताक्षरित पूर्णांक हस्ताक्षरित पूर्णांक को ओवरफ़्लो करेगा?

धन्यवाद।

+0

सी में हस्ताक्षरित हस्ताक्षरित रूपांतरण के संभावित डुप्लिकेट - क्या यह हमेशा सुरक्षित है?] (Http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always -साफ) –

+0

एक पूर्ण डुप्लिकेट नहीं है। उस प्रश्न में एक 'हस्ताक्षरित' चर में अंतिम असाइनमेंट था, इसलिए अंकगणित समान है लेकिन अंतिम असाइनमेंट अलग है। –

+0

यह देखने के लायक भी है: [* हस्ताक्षरित पूर्णांक घटाव परिभाषित व्यवहार है? *] (Http://stackoverflow.com/q/7221409/1168156) :) – LihO

उत्तर

12

सामान्य रूप से, मानक में 5/9 से परामर्श लें।

अपने उदाहरण में, पर हस्ताक्षर किए मूल्य, तो घटाव सापेक्ष UINT_MAX +1 किया जाता है एक अहस्ताक्षरित परिणाम देने के लिए (यह आधुनिक UINT_MAX + 1 लेने के द्वारा) अहस्ताक्षरित में बदल जाती है।

s पर हस्ताक्षरित मान के रूप में इस परिणाम को संग्रहीत करना मानक अभिन्न रूपांतरण शामिल है - यह 4.7/3 में है। यदि मान signed int की सीमा में है तो यह संरक्षित है, अन्यथा मान कार्यान्वयन-परिभाषित है। मैंने जो भी कार्यान्वयन देखा है, उसे मॉड्यूलो अंकगणित का उपयोग INT_MIN से INT_MAX तक धक्का देने के लिए किया गया है, हालांकि क्रिट का कहना है कि आपको यह करने के लिए चेतावनी मिल सकती है।

"स्टंट" कार्यान्वयन जिन्हें आप शायद कभी सौदा नहीं करेंगे, हस्ताक्षर किए गए-> हस्ताक्षरित रूपांतरण के लिए अलग-अलग नियम हो सकते हैं। उदाहरण के लिए यदि कार्यान्वयन में हस्ताक्षरित पूर्णांक का साइन-आयाम प्रतिनिधित्व होता है, तो हमेशा मॉड्यूलस ले कर परिवर्तित करना संभव नहीं है, क्योंकि +/- (UNIT_MAX+1)/2 को int के रूप में प्रस्तुत करने का कोई तरीका नहीं है।

भी प्रासंगिक 5.17/7, "फ़ॉर्म E1 op= E2 की अभिव्यक्ति के व्यवहार E1 = E1 op E2 कि E1 को छोड़कर के बराबर केवल एक बार मूल्यांकन किया जाता है कि" है। इसका मतलब है कि घटाव unsigned int प्रकार में किया जाता है, हमें यह जानने की जरूरत है कि s - uunsigned int में किया गया है: -= के लिए कोई विशेष नियम नहीं है कि अंकगणित एलएचएस के प्रकार में किया जाना चाहिए।

+0

बस एक अनुस्मारक कि "कार्यान्वयन परिभाषित परिणाम" "कार्यान्वयन परिभाषित सिग्नल" हो सकता है। (सी मानक इस संबंध में स्पष्ट है।) प्रैक्टिस में, आपको दो की पूरक मशीन, गलत परिणाम कहीं और सही परिणाम मिलेंगे। –

+0

@ जेम्स: मुझे लगता है कि सी ++ और सी के बीच एक जानबूझकर अंतर है। सी ++ शब्द काफी स्पष्ट है, "मान कार्यान्वयन-परिभाषित है"।यह नहीं कहता है, "व्यवहार कार्यान्वयन-परिभाषित है", जो एक संकेत की अनुमति देगा। –

-1

आपको एक हस्ताक्षरित पूर्णांक के रूप में पुन: प्रस्तुत किया गया है और एस से घटाया गया है। आखिर में कास्टिंग कोई फर्क नहीं पड़ता है। बिट्स का एक सेट दूसरे से घटाया जाता है और परिणाम एस में जाता है।

+1

यह उत्तर स्वीकार्य उत्तर से असहमत है, जो मानक को बताता है । – nobar

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