भयानक जवाब गैलोर
Ozgur Ozcitak
जब आप अहस्ताक्षरित पर हस्ताक्षर किए से डाली (और इसके विपरीत) आंतरिक संख्या का प्रतिनिधित्व परिवर्तन नहीं है।क्या परिवर्तन है कंपाइलर साइन बिट की व्याख्या कैसे करता है।
यह पूरी तरह से गलत है।
मैट Fredriksson
जब एक अहस्ताक्षरित और एक पर हस्ताक्षर किए चर जोड़ रहे हैं (या किसी भी बाइनरी आपरेशन) दोनों, परोक्ष अहस्ताक्षरित करने के लिए परिवर्तित कर रहे हैं जो में ही किसी विशाल परिणाम में इस मामले परिणाम ।
यह भी गलत है। बिना हस्ताक्षर किए गए इनट्स को इन्ट्स को पदोन्नत किया जा सकता है, चाहे वे बिना हस्ताक्षर किए गए प्रकार में पैडिंग बिट्स के कारण समान सटीक हों।
smh
आपका अलावा आपरेशन पूर्णांक एक अहस्ताक्षरित int करने के लिए परिवर्तित किया कारण बनता है।
गलत। शायद यह करता है और शायद यह नहीं करता है।
हस्ताक्षर किए गए int से हस्ताक्षर किए गए हस्ताक्षर int रूपांतरण कार्यान्वयन पर निर्भर है। (लेकिन यह शायद जिस तरह से आप उम्मीद सबसे इन दिनों प्लेटफार्मों पर काम करता है।)
गलत। यह या तो अपरिभाषित व्यवहार है यदि यह ओवरफ्लो का कारण बनता है या मान संरक्षित होता है।
बेनामी
मैं का मूल्य अहस्ताक्षरित पूर्णांक में बदल जाती है ...
गलत। एक हस्ताक्षरित int के सापेक्ष एक int की परिशुद्धता पर निर्भर करता है।
टेलर मूल्य
जैसा कि पहले उत्तर दिया गया है, तो आप वापस आगे एक समस्या पर भी कास्ट और अहस्ताक्षरित पर हस्ताक्षर किए के बीच और कर सकते हैं।
गलत। अपरिभाषित व्यवहार में एक हस्ताक्षरित पूर्णांक परिणामों की सीमा के बाहर एक मूल्य को स्टोर करने का प्रयास कर रहा है।
अब मैं अंततः प्रश्न का उत्तर दे सकता हूं।
int की परिशुद्धता को हस्ताक्षरित int के बराबर होना चाहिए, आपको एक हस्ताक्षरित int में पदोन्नत किया जाएगा और आपको अभिव्यक्ति (u + i) से मूल्य -4444 प्राप्त होगा। अब, क्या आपके पास और मेरे पास अन्य मूल्य हैं, आप अतिप्रवाह और अपरिभाषित व्यवहार प्राप्त कर सकते हैं लेकिन उन सटीक संख्याओं के साथ आपको -4444 [1] मिलेगा। इस मान में टाइप int होगा।लेकिन आप उस मान को एक हस्ताक्षरित int में संग्रहीत करने की कोशिश कर रहे हैं ताकि उसके बाद एक हस्ताक्षरित int और मूल्य जो परिणाम समाप्त हो जाएगा (UINT_MAX + 1) - 4444.
को हस्ताक्षर किए जाने की सटीकता int int की तुलना में अधिक हो, हस्ताक्षरित int को मूल्य (UINT_MAX + 1) - 5678 उत्पन्न करने वाले एक हस्ताक्षरित int को बढ़ावा दिया जाएगा जो अन्य हस्ताक्षरित int 1234 में जोड़ा जाएगा। क्या आपके और मेरे पास अन्य मान हैं, जो आपको बनाना चाहिए अभिव्यक्ति {0..UINT_MAX} रेंज के बाहर गिरती है (UINT_MAX + 1) या तो तब तक जोड़ा या घटाया जाएगा जब तक कि परिणाम {0..UINT_MAX) के अंदर न हो जाए और कोई अपरिभाषित व्यवहार न हो।
सटीकता क्या है?
इंटीग्रियों में पैडिंग बिट्स, साइन बिट्स और वैल्यू बिट्स हैं। बिना हस्ताक्षर किए गए पूर्णांक में स्पष्ट रूप से साइन बिट नहीं है। बिना हस्ताक्षर किए गए चार को आगे पैडिंग बिट्स की गारंटी नहीं है। एक पूर्णांक बिट्स मानों की संख्या यह है कि इसमें कितना सटीकता है।
[Gotchas]
मैक्रो sizeof मैक्रो अकेले एक पूर्णांक की शुद्धता निर्धारित करने के लिए करता है, तो गद्दी बिट्स मौजूद हैं नहीं किया जा सकता। और एक बाइट का आकार सी 99 द्वारा परिभाषित एक ऑक्टेट (आठ बिट्स) होना आवश्यक नहीं है।
[1] अतिप्रवाह दो बिंदुओं में से एक पर हो सकता है। इसके अलावा (प्रचार के दौरान) - जब आपके पास एक हस्ताक्षरित int है जो int के अंदर फिट होने के लिए बहुत बड़ा है। ओवरफ्लो भी जोड़ के बाद भी हो सकता है भले ही बिना हस्ताक्षर किए int int int की सीमा के भीतर था, इसके परिणामस्वरूप परिणाम अभी भी अतिप्रवाह हो सकता है।
एक असंबंधित नोट पर, मैं हाल ही में एक स्नातक काम खोजने की कोशिश कर छात्र हूँ;)
वहाँ वाह। हस्ताक्षरित से हस्ताक्षरित होने के लिए यह अच्छी तरह से परिभाषित किया गया है, लेकिन हस्ताक्षरित हस्ताक्षर से हस्ताक्षर करने के लिए कार्यान्वयन-परिभाषित किया गया है। – rlbond
यह सही नहीं है। एक भाषा दृष्टिकोण से 'int' से' unsigned int 'में पूर्णांक रूपांतरण में स्रोत ऑब्जेक्ट के मूल्य और कुछ भी (अवधारणात्मक रूप से) इसके आंतरिक प्रतिनिधित्व के साथ सबकुछ करना है। मान मॉड्यूलो 2^एन अंकगणित का उपयोग करके परिवर्तित किया जाता है जहां एन 'हस्ताक्षर किए गए int' में मूल्य बिट्स की संख्या है जो 'int' के लिए कार्यान्वयन उपयोग का प्रतिनिधित्व करता है। –
यह उत्तर बस गलत है। यह समझाता है कि सामान्य कार्यान्वयन कैसे काम करते हैं, न कि भाषा कैसे काम करती है। –