सामान्य रूप से, मानक में 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 - u
unsigned int
में किया गया है: -=
के लिए कोई विशेष नियम नहीं है कि अंकगणित एलएचएस के प्रकार में किया जाना चाहिए।
स्रोत
2011-03-16 17:06:23
सी में हस्ताक्षरित हस्ताक्षरित रूपांतरण के संभावित डुप्लिकेट - क्या यह हमेशा सुरक्षित है?] (Http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always -साफ) –
एक पूर्ण डुप्लिकेट नहीं है। उस प्रश्न में एक 'हस्ताक्षरित' चर में अंतिम असाइनमेंट था, इसलिए अंकगणित समान है लेकिन अंतिम असाइनमेंट अलग है। –
यह देखने के लायक भी है: [* हस्ताक्षरित पूर्णांक घटाव परिभाषित व्यवहार है? *] (Http://stackoverflow.com/q/7221409/1168156) :) – LihO