दो का पूरक और fmt.Printf: बाइनरी प्रतिनिधित्व पहेली को सुलझाना
हस्ताक्षरित पूर्णांकों के साथ काम करते समय, कंप्यूटर नकारात्मक मूल्यों का प्रतिनिधित्व करने के लिए दो के पूरक का उपयोग करते हैं . यह विशिष्ट बाइनरी प्रतिनिधित्व से भिन्न है, जहां चिह्न को एक अलग बिट द्वारा दर्शाया जाता है। उदाहरण के लिए, टू के पूरक में, पूर्णांक -5 को 1111 1011 के रूप में दर्शाया गया है।
हालाँकि, fmt.Printf का उपयोग करके बाइनरी प्रतिनिधित्व को प्रिंट करने से अप्रत्याशित परिणाम मिल सकते हैं। उदाहरण के लिए, निम्नलिखित कोड स्निपेट:
var i int8 = -5 fmt.Printf("%b", i)
आश्चर्यजनक रूप से 1111 1011 के बजाय -101 आउटपुट देता है। इस विसंगति के कारण यह सवाल खड़ा हो गया है कि क्या टू के पूरक का उपयोग वास्तव में आंतरिक प्रतिनिधित्व के लिए किया जा रहा है या यदि स्वरूपण अस्पष्ट है सही प्रतिनिधित्व।
इस मामले पर प्रकाश डालने के लिए, हमें यह जानने की जरूरत है कि कैसे fmt.Printf बाइनरी संख्याओं को प्रारूपित करता है। अपराधी fmt.integer फ़ंक्शन में रहता है, जो स्वचालित रूप से नकारात्मक हस्ताक्षरित पूर्णांकों को सकारात्मक पूर्णांकों में परिवर्तित करता है। इस रूपांतरण में पूर्णांक को नकारना और आउटपुट स्ट्रिंग में - चिह्न जोड़ना शामिल है। इस प्रकार, -101 आउटपुट 5 के बाइनरी प्रतिनिधित्व में संलग्न - का एक प्रतिनिधित्व है। पूरक प्रतिनिधित्व:
var u uint8 = uint(i) fmt.Printf("%b", u)
var u uint8 = uint(i) fmt.Printf("%b", u)
इसलिए, गो में हस्ताक्षरित पूर्णांकों का आंतरिक प्रतिनिधित्व दो के पूरक का पालन करता है सम्मेलन। हस्ताक्षरित पूर्णांकों को स्वरूपित करते समय प्रतीत होने वाला गलत बाइनरी प्रतिनिधित्व fmt.integer द्वारा किए गए स्वचालित रूपांतरण और साइन प्रीपेन्डिंग के परिणामस्वरूप होता है। गो में हस्ताक्षरित पूर्णांकों और बाइनरी अभ्यावेदन के साथ काम करते समय इस व्यवहार को समझना आवश्यक है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3