یہ کیا ہے؟ · bei.pm
اس حصے میں فائل کی شکلوں اور ریورس انجینئرنگ کے بارے میں مضامین موجود ہیں۔
لیکن ایسا ہے:
بہت ساری پروگرامنگ زبانیں موجود ہیں اور بہت سے لوگ کچھ چیزوں کو بالکل مختلف ناموں سے جانتے ہیں - یا بنیادی چیزوں کی موجودگی کے بارے میں بالکل بھی نہیں جانتے، کیونکہ ان کی پروگرامنگ زبان ان سے یہ چیزیں دور کر دیتی ہے۔
tl;dr:
میری نوٹیشن بنیادی طور پر C99 <stdint.h>
کی طرف متوجہ ہے۔ جو کوئی اس نوٹیشن سے واقف ہے، وہ میری نوٹیشن کو بآسانی سمجھ جائے گا۔
عدد صحیح
انٹیجر دراصل مکمل نمبر ہیں، یعنی بغیر اعشاریہ کے نمبر۔
یہاں انٹیجر عموماً ایک مخصوص عددی دائرے، یعنی ایک ریزولوشن، کے اندر ڈیٹا فارمیٹس میں متعین کیے جاتے ہیں۔ میں یہ بٹس میں بیان کرتا ہوں - کیونکہ ایک "بائٹ" اور اس پر مبنی اقسام (ورڈ، کیوورڈ، ...) عام طور پر پلیٹ فارم پر منحصر ہوتی ہیں۔
اس کے علاوہ، انٹیجر کی اقسام میں قدرتی نمبروں (ℕ، یعنی، بغیر سائن - Unsigned) اور مکمل نمبروں (ℤ، یعنی، سائن کے ساتھ - Signed) کے درمیان بھی فرق کیا جاتا ہے۔
یہ معلومات ایک سائن کے ذریعے شناخت کنندہ میں (u
یا s
) ظاہر کی جاتی ہے۔
یہ ممکن ہے کہ سائن شدہ مکمل نمبروں کو یا تو ونز کمپلیمنٹ کے طور پر پیش کیا جائے یا ٹو کمپلیمنٹ کے طور پر۔
جب تک کچھ اور نہ کہا جائے، ٹو کمپلیمنٹ کا استعمال کیا جاتا ہے، کیونکہ یہ جدید کمپیوٹنگ میں پسندیدہ پیشکش ہے۔
میں اپنی دستاویزات میں بغیر سائن والے نمبروں کو uint
کے طور پر بیان کرتا ہوں، جس کے بعد درستگی کی وضاحت بٹس میں کی جاتی ہے۔
سائن شدہ نمبروں کو میں اپنی دستاویزات میں sint
کے طور پر بیان کرتا ہوں، اسی طرح درستگی کی وضاحت بٹس میں کی جاتی ہے۔
میں "char" ڈیٹا ٹائپ کو علامات کے لیے استعمال کرنے سے گریز کرتا ہوں، کیونکہ سٹرنگز عام طور پر صرف انٹیجر ویلیوز کے سلسلے کو ایک خاص تشریح کے ساتھ پیش کرتی ہیں۔
لہذا انہیں uint(8)[] کے طور پر پیش کیا جاتا ہے۔
مثالیں:
نوٹیشن | C99 stdint.h -ہم منصب |
تفصیل | عدد کی حد |
---|---|---|---|
uint(16) | uint16_t | غیر دستخط شدہ عدد، 16 بٹ لمبائی | 0 - 65.535 |
sint(8) | int8_t | دستخط شدہ عدد، 8 بٹ لمبائی، دوئی مکمل | -126 - 127 |
uint(24) | uint32_t:24 | غیر دستخط شدہ عدد، 24 بٹ لمبائی | 0 - 16.777.216 |
فیسٹکما ویلیوز
فکسڈ پوائنٹ ویلیوز وہ عددی قیمتیں ہیں جو حقیقی نمبروں (Q) کی رینج میں آتی ہیں، جو ایک کامہ اور بعد کے اعداد پر مشتمل ہوتی ہیں۔
فکسڈ پوائنٹ ویلیوز میں - اسی وجہ سے نام بھی ایسا ہے - کامے کی جگہ ڈیٹا ٹائپ کے ذریعہ مقرر کی جاتی ہے۔
اس کے نتیجے میں اس ڈیٹا ٹائپ کے اعداد کے لیے ایک مقررہ عددی دائرہ بنتا ہے؛ ریاضی کے لحاظ سے یہ عددی دائرہ محدود ہے۔
حقیقت میں، یہ ڈیٹا ٹائپ بنیادی طور پر ایسی پلیٹ فارم پر استعمال ہوتا ہے جہاں فلوٹنگ پوائنٹ ہارڈ ویئر کی رفتار کافی تیز نہیں ہوتی، کیونکہ فکسڈ پوائنٹ ویلیوز کی حساب کتاب Integer یونٹس کے ذریعہ کی جا سکتی ہے۔
یہ ڈیٹا ٹائپ، مثلاً، ڈیٹا بیس منیجمنٹ سسٹمز کے ذریعہ بھی استعمال ہوتا ہے جب مخصوص تقاضے پورے کرنے کی ضرورت ہوتی ہے۔
یہاں ہم مالیاتی معلومات کی مستقل ذخیرہ اندوزی کے نظام کا تصور کر سکتے ہیں؛ زیادہ تر کرنسیز میں کامے کے بعد 2 اعداد تک محدود ہوتی ہیں۔
(لیکن یہاں فکسڈ پوائنٹ ویلیوز کا استعمال کرنا عقلمندی نہیں ہے؛ بلکہ بہتر یہ ہے کہ براہ راست سب سے چھوٹی کرنسی کی اکائی کو Integer کے طور پر محفوظ کریں اور باقی کی نمائندگی کی سطح کو چھوڑ دیں)
Integer کی وضاحتوں کی طرح، میں فکسڈ پوائنٹ ویلیوز میں عدد کی وضاحت کامے سے پہلے اور کامے کے بعد کرتا ہوں:
ufixed(9,7)
ایک ڈیٹا ٹائپ کی نشاندہی کرتا ہے جو بغیر سائن کے 9 بٹس کو کامے سے پہلے کی قیمت کے لیے اور 7 بٹس کو کامے کے بعد کی قیمت کے لیے مخصوص کرتا ہے؛ اس طرح کل مل کر یہ 16 بٹس کی چوڑائی رکھتا ہے اور اس طرح بطور ویکٹر دو آزاد Integer کی شکل میں (0,0) سے (511,127) تک کی رینج کا احاطہ کر سکتا ہے۔
تاہم، یہ تشریح اپنی اعشاریہ شکل میں 28 اعداد کو بے فائدہ چھوڑ دے گی، کیونکہ عملی طور پر زیادہ سے زیادہ (511,99) تک محدود رہنے کا امکان ہوتا ہے۔
فکسڈ پوائنٹ ویلیو کی براہ راست تشریح کے بجائے، جو 2 الگ Integer کا ویکٹر ہے - جو کہ تقریباً ہمیشہ اعشاریہ اعداد میں تبدیل کرتے وقت ایک بے استعمال ڈیٹا رینج اور ایک دستی منتقلی کا مطلب ہوتا ہے - اس کے بجائے بعد کے اعداد کی جگہ کو ان کی مکمل وضاحت کے کسر کی شکل میں بھی تشریح کیا جا سکتا ہے۔
ابھی ذکر کردہ ufixed(9,7)
کے مثال کے ساتھ، اس طرح ایک کسر بنتی ہے جس کا مخرج 27 ہے - عددی دائرہ پھر 0.00 سے 511 + 126⁄127 تک جاتا ہے۔
اعشاریہ شکل میں تبدیل کرنے کے لیے، بعد کے عدد کو 128 سے تقسیم کیا جائے گا۔
اس ورژن کے ساتھ حسابی عمل کو آسانی سے کیا جا سکتا ہے، کیونکہ منتقلی خود بخود ہوجاتی ہے، جس کی وجہ سے یہ ورژن عام طور پر ترجیحی ہوتا ہے۔
تاہم، اس ورژن کا نقص یہ ہے کہ اعشاریہ شکل میں بعد کے اعداد کی وضاحت کی ضمانت نہیں ہوتی، یعنی ایک واحد اعشاریہ عدد اب 0.01
کے مساوی نہیں ہوتا، بلکہ 0.007874
ہوتا ہے، جو متعلقہ گولائی کی غلطیوں کا باعث بنے گا۔
کہاں تشریح کا طریقہ استعمال کیا جائے گا، اس کا ذکر استعمال کی جگہ پر کیا جائے گا۔
فلوٹنگ یا گلیٹ کومہ کی قیمتیں
فلوٹنگ پوائنٹس ریاضیاتی طور پر زیادہ پیچیدہ اظہار ہیں، جہاں ایک صحیح عدد کو ایک ریاضیاتی فارمولا کے ذریعے اس طرح بیان کیا جاتا ہے کہ مؤثر طریقے سے اعشاری حصہ شفٹ کی مدد سے بنایا جاتا ہے - اور اس طرح براہ راست سائنسی نوٹیشن کی طرف اشارہ کرتا ہے۔
یہ عمل عام طور پر
IEEE 754 کے تحت معیاری بنایا گیا ہے اور تب سے بین الاقوامی طور پر تسلیم شدہ ہے۔
ایک فلوٹنگ پوائنٹ ویلیو عام طور پر درج ذیل اجزاء پر مشتمل ہوتی ہے:
سائن (0 یا 1 ) |
ایکسپوننٹ | مینٹس |
جبکہ سائن کو بائنری ہاں/نہ کی معلومات کے طور پر آسانی سے حاصل کیا جا سکتا ہے، اصل عدد مساوات کے ذریعے بنتی ہے
مینٹس * 2ایکسپوننٹ
اس کے علاوہ کچھ مستقل اقدار بھی ہیں جو خاص کیسز عقلی اعداد کا احاطہ کرتی ہیں - جن میں ±∞
اور NaN
("کوئی درست عدد نہیں") شامل ہیں۔
فلوٹنگ پوائنٹس خاص طور پر اس وقت مفید ہوتے ہیں جب درستگی اتنی اہم نہیں ہے، کیونکہ اس قسم کے اقدار میں لازمی طور پر گولائی کی غلطیاں اور اس طرح درستگی کا نقصان ہوتا ہے۔ عموماً فلوٹنگ پوائنٹس کو مثلاً کوآرڈینیٹس کی تعریف کے لیے استعمال کیا جاتا ہے، جیسے کہ 3D ماڈلز میں ورٹیکس ویکٹر یا بصری نمائندگی کے مقاصد کے لیے بیزیئر/سپلائن منحنی خطوط۔
ڈیٹا فارمیٹس میں فلوٹنگ پوائنٹس کو float(مینٹس, ایکسپوننٹ)
کے طور پر وضاحت کی جاتی ہے۔
اگر IEEE 754 سے مختلف کوئی فارمیٹ استعمال کیا جائے تو اس کی مناسب وضاحت کی جائے گی۔