2013-02-19 44 views
9

यह एक लंबे समय से किया गया है के बाद से मैं पिछले बिट और बाइट स्तर पर प्रोग्राम किया और कुछ मैं उन दिनों से याद करने लगते हैं इस बात की पुष्टि करना चाहता था:दो पर हस्ताक्षर किए जोड़ना या अहस्ताक्षरित पूर्णांकों

मैं समान अवधि की दो पूर्णांकों है कहो (1, 2, 4, 8 बाइट्स; इससे कोई फर्क नहीं पड़ता), और मैं उन्हें जोड़ता हूं: क्या योग के बिट-बाय-बिट परिणाम भिन्न होते हैं यदि वे हस्ताक्षरित हैं या हस्ताक्षरित हैं। दूसरे शब्दों में: इस पर ध्यान दिए बिना कि वे हस्ताक्षरित हैं या हस्ताक्षरित पूर्णांक हैं, क्या बिट्स एक जैसा होगा?

मेरी अंतर्ज्ञान और मेरी कमजोर स्मृति मुझे बताती है कि वे करेंगे, लेकिन मैं बस पुष्टि करना चाहता था। धन्यवाद।

+1

आईआईआरसी, हालांकि परिणाम ठीक दिखता है, सी/सी ++ मानक पूर्णांक ओवरफ्लो परिणाम अपरिभाषित व्यवहार में कहता है। ** संपादित करें **: बिना हस्ताक्षर किए गए अंकगणित अतिप्रवाह नहीं है, और सामान्य रूप से लपेटें-आसपास का पालन करें। – nhahtdh

+0

@nhahtdh: धन्यवाद; ठीक है। मैंने इसे सी ++ के साथ टैग किया क्योंकि मैंने सोचा कि यह पूछने के लिए एक अच्छा दर्शक होगा, लेकिन मैं इसे किसी अन्य भाषा में उपयोग करूँगा। – Eduardo

+2

http://stackoverflow.com/questions/9024826/how-disastrous-is-integer-overflow-in-c – nhahtdh

उत्तर

13

कार्यान्वयन मानते हुए हस्ताक्षर पूर्णांक के प्रतिनिधित्व के रूप में 2 के पूरक का उपयोग करते हैं, तो परिणाम समान होंगे। अन्य प्रस्तुतियों में, वे नहीं करेंगे।

संपादित

के रूप में टिप्पणी में कहा, पर हस्ताक्षर किए अलावा अतिप्रवाह अपरिभाषित व्यवहार है, जो कुछ भी तरह के मामले में परिणाम के बारे में कहा जा सकता है इसका मतलब है।

+0

मेरी इच्छा है कि मैं आपको दो बार वोट दे सकता हूं: एक बार जवाब के लिए और दूसरा यह पुष्टि करने के लिए कि मेरी याददाश्त खराब नहीं है :-) – Eduardo

+1

@Eduardo, मैं दूसरे वोट में पिच करूंगा। अच्छा, छोटा, सही उत्तर। – Lindydancer

+3

और जब अतिरिक्त में यूबी का आह्वान करते हैं, तो वे भी नहीं करेंगे। – PlasmaHH

4

मुझे पता है कि इसका पहले से ही उत्तर दिया गया है, लेकिन सभी प्रोसेसर जिनके साथ मैंने कभी काम किया है (लगभग एक दर्जन विभिन्न आर्किटेक्चर - और मेरा मतलब है आर्किटेक्चर, अलग-अलग स्वाद नहीं) केवल एक प्रकार का एडीडी निर्देश है - यह अलग हो सकता है आकार विकल्प, लेकिन यह एक निर्देश है। वही घटता है पर लागू होता है। यह गुणा और विभाजित करने पर अलग है जिसमें आम तौर पर हस्ताक्षरित और हस्ताक्षरित के लिए भिन्नताएं होती हैं - या इनपुट को किसी भी तरह से "समायोजित साइन" होने की आवश्यकता होती है।

हस्ताक्षरित और हस्ताक्षरित के बीच भेद बनाने वाले एकमात्र अन्य निर्देश सशर्त निर्देश हैं, उदा। "कम से कम शाखा" में "हस्ताक्षर किए गए से कम" के लिए एक संस्करण होगा और "कम से कम हस्ताक्षर किए गए" के लिए एक संस्करण होगा (जिसमें से एक को आमतौर पर "नीचे" या "कैर सेट" जैसे "कुछ से कम" कहा जाता है। या कुछ ऐसे)।

+0

यह एक बहुत अच्छा मुद्दा है - भले ही मानक कहता है कि व्यवहार अपरिभाषित है, अंतर्निहित CPU आर्किटेक्चर ऐसा कुछ करने की संभावना नहीं है। ऐसा नहीं है कि सी और सी ++ रोल कैसे। –

+1

@MarkRansom यह वास्तव में संदर्भ पर निर्भर करता है। ऊपर nhahtdh द्वारा जुड़ा सवाल एक उदाहरण दिखाता है जहां संकलक हस्तक्षेप करता है। – Angew

+0

हां। बेशक, कुछ CPU हो सकते हैं जिनके पास "एड" और "घटाना" के लिए अलग-अलग हस्ताक्षरित और हस्ताक्षरित निर्देश हैं, मुझे अभी तक एक देखना है [या यहां तक ​​कि एक के बारे में भी सुनना]। सी/सी ++ विनिर्देश भाषा वकीलों द्वारा लिखे गए हैं जिन्हें सभी प्रकार के WEIRD हार्डवेयर को संतुष्ट करना है। इसका मतलब यह नहीं है कि हम उस प्रकार के हार्डवेयर को अक्सर देखेंगे ...;) –