सारांश
प्रोग्राम का पूर्णांक गणित का पूर्णांक नहीं है: वह बिटों का एक परिमित अनुक्रम है, और बिट में ठीक भिन्न मान समाते हैं। यह पाठ इस निरूपण और इसके परिणामों का अध्ययन करता है। यह सिखाता है कि किसी पूर्णांक को आधार 2 और आधार 16 में कैसे लिखें और फ़ॉर्मैट विनिर्देशों {:b} और {:x} से उसकी जाँच कैसे करें; C++ के पूर्णांक प्रकार प्रस्तुत करता है, उनका आकार, जो sizeof से मापा जाता है, और उनके मानों की परास, जो std::numeric_limits से पूछी जाती है; समझाता है कि ऋणात्मक संख्याएँ दो के पूरक से कैसे निरूपित होती हैं और परास सममित क्यों नहीं है; चिह्नित पूर्णांकों को अचिह्नित पूर्णांकों से अलग करता है, और अध्ययन करता है कि जब कोई संक्रिया परास से बाहर जाती है तो क्या होता है: अचिह्नित में मानक परिणाम परिभाषित करता है, जो मापांक अंकगणित है; चिह्नित में परिभाषित नहीं करता, और प्रोग्राम हर गारंटी से बाहर हो जाता है। अंत में हर डेटा का प्रकार चुनने की एक कसौटी दी गई है।
अधिगम उद्देश्य
- पूर्णांकों को आधार 10, 2 और 16 के बीच बदलना, और फ़ॉर्मैट विनिर्देशों
{:b}और{:x}से रूपांतरण की जाँच करना। - बिट वाले पूर्णांक के मानों की परास चिह्नित और अचिह्नित दोनों रूपों में निकालना, और
std::numeric_limitsतथाsizeofसे उसकी जाँच करना। - दो के पूरक को समझाना और किसी छोटी ऋणात्मक संख्या का आठ बिट में निरूपण लिखना।
- चिह्नित ओवरफ़्लो, जो अपरिभाषित व्यवहार है, और अचिह्नित ओवरफ़्लो, जो मापांक अंकगणित है, में अंतर करना, और दूसरे का परिणाम पहले से बताना।
- किसी डेटा की संभावित परास के अनुसार उपयुक्त पूर्णांक प्रकार चुनना, और जब चौड़ाई मायने रखती हो तो
<cstdint>के नियत चौड़ाई वाले प्रकारों का उपयोग करना।
स्थानीय मान पद्धतियाँ
पाठ चर और मेमोरी ने चर को नाम, प्रकार और मान वाले एक सेल के रूप में प्रस्तुत किया था। परंतु मेमोरी दशमलव अंक नहीं रखती: वह बिट रखती है, जिनमें से हर एक का मान 0 या 1 होता है, और जो आठ-आठ बिट के बाइटों में समूहित होते हैं (मानक कम से कम आठ की माँग करता है; आज की सभी प्रणालियाँ ठीक आठ का उपयोग करती हैं)। इसलिए यह जानने के लिए कि कोई पूर्णांक चर कौन-से मान ले सकता है, यह जानना ज़रूरी है कि केवल दो अंकों से कोई संख्या कैसे लिखी जाती है, और यही काम आधार 2 वाली स्थानीय मान पद्धति करती है।
आधार वाली स्थानीय मान पद्धति में हर अंक का मान उस स्थान पर निर्भर करता है जिसे वह घेरता है: अंतिम अंक से गुणा होता है, उससे पहले वाला से, उससे भी पहले वाला से, और इसी तरह आगे। आधार 10 में का अर्थ है । आधार 2 में अंक 0 और 1 हैं, और भार 2 की घातें हैं: इससे द्विआधारी से दशमलव में जाने का नियम निकलता है: जिन स्थानों पर 1 है, उनके भार जोड़ दिए जाते हैं।
चित्र आठ बिट के पैटर्न 00101101 को पढ़ता है। हर सेल के ऊपर उसका भार है; 1 वाले बिट बाएँ से दाएँ एक-एक करके जलते हैं, और मान उनके भारों को जोड़ता जाता है।
प्रमाण
आठ सेल, सभी बुझे हुए: मान 0 है। भार, दाएँ से बाएँ, ये हैं: ।
पहला 1 भार 32 वाले स्थान पर है: जुड़ा हुआ मान 32 है।
उसके बाद वाला, भार 8 वाले स्थान पर: ।
फिर उसके बाद वाला, भार 4 वाले स्थान पर: ।
अंतिम 1, भार 1 वाले स्थान पर: । पैटर्न
00101101संख्या 45 को निरूपित करता है।चार-चार के समूहों में बाँटने पर बिट षोडशआधारी अंक देते हैं:
0010है 2 और1101है 13, जो आधार 16 मेंdलिखा जाता है। इसलिए 45 को आधार 16 में2dलिखा जाता है।
उलटा रास्ता, दशमलव से द्विआधारी तक, क्रमिक विभाजन से तय किया जाता है: संख्या को 2 से भाग दिया जाता है, शेषफल (0 या 1) लिख लिया जाता है, और भागफल के साथ यही दोहराया जाता है जब तक 0 न आ जाए; अंतिम से पहले की ओर पढ़े गए शेषफल ही द्विआधारी अंक हैं। 45 के लिए: , , , , , ; उलटे क्रम में पढ़ने पर शेषफल 101101 देते हैं, जो बाईं ओर दो शून्य जोड़ने पर चित्र का पैटर्न है। कारण यह है कि हर शेषफल उस संख्या का सबसे दाहिना अंक है जिसे भाग दिया जा रहा है, और हर भागफल वही संख्या है जो एक स्थान दाईं ओर खिसका दी गई है। यही विधि किसी भी आधार के लिए काम करती है: आधार 16 के लिए 16 से भाग दिया जाता है, और 10 से 15 तक के शेषफल a से f तक के अक्षरों से लिखे जाते हैं।
आधार 16, या षोडशआधारी पद्धति, सुविधा के लिए है: चूँकि , हर षोडशआधारी अंक ठीक चार बिट के संगत है, और एक बाइट दो अंकों में लिखा जाता है। 32 बिट की संख्या द्विआधारी में बत्तीस अंक घेरती है, जो मुश्किल से पढ़े जाते हैं, और षोडशआधारी में केवल आठ, जो बिना गणना के, अंक-दर-अंक, द्विआधारी में बदल जाते हैं। इसीलिए प्रोग्रामर मेमोरी को षोडशआधारी में पढ़ते हैं। स्थानीय मान पद्धतियों की गणितीय नींव पाठ्यक्रम “बीजगणित और ज्यामिति I” के पाठ “स्थानीय मान पर आधारित संख्यांकन पद्धतियाँ” में पढ़ा जाता है।
C++ इन आधारों में सीधे लिखे गए पूर्णांक स्वीकार करती है: 0b से शुरू होने वाला लिटरल द्विआधारी में होता है, और 0x से शुरू होने वाला षोडशआधारी में। किसी भी लिटरल के भीतर अंक विभाजक के रूप में एक एपॉस्ट्रॉफ़ी रखी जा सकती है, जिसे कंपाइलर अनदेखा करता है और पढ़ने वाला सराहता है: 0b0010'1101, 1'000'000। आउटपुट में फ़ॉर्मैट विनिर्देश {:b} पूर्णांक को द्विआधारी में लिखता है, {:x} छोटे अक्षरों वाले षोडशआधारी में और {:X} बड़े अक्षरों में; चिह्न # आगे उपसर्ग जोड़ता है, और जिस चौड़ाई के आगे शून्य हो वह बाईं ओर शून्य भरती है।
#include <print>int main(){ const int decimal{45}; const int binary{0b0010'1101}; const int hexadecimal{0x2d}; std::println("{} {} {}", decimal, binary, hexadecimal); std::println("द्विआधारी: {:b}", decimal); std::println("आठ बिट: {:08b}", decimal); std::println("षोडशआधारी: {:x} {:X} {:#x}", decimal, decimal, decimal);}45 45 45द्विआधारी: 101101आठ बिट: 00101101षोडशआधारी: 2d 2D 0x2dतीनों चर एक ही मान रखते हैं, जो तीन आधारों में लिखा गया है, और आउटपुट की पहली पंक्ति यही दिखाती है: आधार लेखन का गुण है, संख्या का नहीं। तीनों स्थितियों में मेमोरी एक ही बिट पैटर्न रखती है। विनिर्देश {:b} बाईं ओर के शून्य छोड़ देता है; {:08b} आठ अंक पूरे करता है।
सामग्री लोड हो रही है…