چیست چیست؟ · bei.pm
در این بخش مقالاتی درباره فرمتهای فایل و مهندسی معکوس وجود دارد.
اما حالا اینگونه است:
در بیرون زبانهای برنامهنویسی زیادی وجود دارد و افراد زیادی هستند که برخی از چیزها را با نامهای کاملاً متفاوت میشناسند - یا حتی هیچ اطلاعی از وجود ابتداییترین چیزها ندارند، زیرا زبان برنامهنویسی آنها این موارد را از آنها دور کرده است.
خلاصه:
یادداشت من عمدتاً بر اساس C99 <stdint.h>
است. کسانی که با این یادداشت آشنا هستند، مطمئناً میتوانند با یادداشت من نیز راحت باشند.
عدد صحیح
عدد صحیح به سادگی اعداد صحیح هستند، یعنی اعداد بدون قسمت اعشاری.
عدد صحیح معمولاً در فرمتهای دادهای در یک طیف عددی مشخص، تقریباً به عنوان یک وضوح، تعریف شدهاند. این را به بیت بیان میکنم - به این دلیل که یک "بایت" و انواع مبتنی بر آن (Word، Qword، ...) معمولاً به پلتفرم وابسته هستند.
علاوه بر این، در نوعهای عدد صحیح همچنین بین اعداد طبیعی (ℕ، یعنی بدون علامت - Unsigned) و اعداد صحیح (ℤ، یعنی با علامت - Signed) تمایز قائل میشوند.
این اطلاعات از طریق یک علامت در شناسه (u
یا s
) قابل مشاهده است.
این امکان وجود دارد که اعداد صحیح با علامت به عنوان مکمل یک یا به عنوان مکمل دو نمایش داده شوند.
تا زمانی که چیز دیگری اعلام نشده باشد، مکمل دو استفاده میشود، زیرا در علم کامپیوتر مدرن نمایندگی ترجیحی است.
اعداد بدون علامت را در مستندات خود به عنوان uint
مشخص میکنم، با مشخص کردن دقت در بیتها بعد از آن.
اعداد با علامت را در مستندات خود به عنوان sint
مشخص میکنم، همچنین با مشخص کردن دقت در بیتها بعد از آن.
از استفاده از نوع داده "char" برای کاراکترها خودداری میکنم، زیرا رشتههای کاراکتری معمولاً تنها زنجیرههای مقادیر عدد صحیح با تفسیر خاصی هستند.
بنابراین اینها به عنوان uint(8)[] نمایش داده میشوند.
نمونهها:
نوتیشن | معادل stdint.h C99 |
توضیحات | محدوده اعداد |
---|---|---|---|
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) هستند که بنابراین دارای یک نقطه و همچنین نقاط اعشاری میباشند.
در اعداد ثابتنقطهای - و به همین دلیل نامش - موقعیت نقطه توسط نوع داده بهطور ثابت تعیین شده است.
از این رو، یک دامنه عددی ثابت برای اعداد این نوع داده وجود دارد؛ بهطور ریاضی، فضای عددی محدود است.
در واقعیت، این نوع داده عمدتاً در پلتفرمهایی که واحد سختافزاری اعشاری کافی سریع ندارند، استفاده میشود، زیرا محاسبه اعداد ثابتنقطهای میتواند توسط واحدهای عدد صحیح انجام شود.
این نوع داده همچنین بهعنوان مثال توسط سیستمهای مدیریت پایگاه داده استفاده میشود، زمانی که الزامات ثابت باید برآورده شوند.
به عنوان مثال، به سیستمهایی که برای ذخیرهسازی دائمی دادههای مالی طراحی شدهاند، فکر کنید؛ اکثر ارزها به 2 نقطه اعشاری محدود میشوند.
(اما استفاده از اعداد ثابتنقطهای برای این منظور هوشمندانه نیست؛ بهتر است بهطور مستقیم کوچکترین واحد ارزی را بهعنوان عدد صحیح ذخیره کرده و بقیه سطح نمایش را رها کنید)
برابر با مشخصات عدد صحیح، در اعداد ثابتنقطهای، من وضوح عدد قبل و بعد از نقطه را مشخص میکنم:
ufixed(9,7)
نوع دادهای را نشان میدهد که 9 بیت بدون علامت برای مقدار قبل از نقطه و 7 بیت برای مقدار بعد از نقطه اختصاص داده شده است؛ بنابراین در مجموع 16 بیت عرض دارد و میتواند بهعنوان یک وکتور از دو عدد صحیح مستقل، دامنهای از (0,0) تا (511,127) را پوشش دهد.
اما این تفسیر در نمایش دهدهی خود 28 عدد را بیاستفاده به هدر میدهد، زیرا احتمالاً در عمل به حداکثر (511,99) محدود میشود.
بهجای تفسیر مستقیم مقدار ثابتنقطهای بهعنوان وکتوری از 2 عدد صحیح جداگانه - که تقریباً همیشه به معنای هدر رفتن یک ناحیه داده هنگام تبدیل به اعداد دهدهی و یک انتقال دستی است - میتوان بهجای آن ناحیه اعشاری را بهعنوان کسر کل وضوح آن تفسیر کرد.
با مثال ذکر شده ufixed(9,7)
، یک کسر با مخرج 27 بهدست میآید - دامنه عددی سپس از 0.00 تا 511 + 126⁄127
برای تبدیل به یک نمایش دهدهی، نقطه اعشاری باید بر 128 تقسیم شود.
با این گزینه، عملیات ریاضی آسانتر انجام میشود، زیرا انتقال بهطور خودکار ایجاد میشود و به همین دلیل این گزینه بهطور کلی ترجیح داده میشود.
با این حال، این گزینه معایبی دارد؛ زیرا نقاط اعشاری در نمایش دهدهی دیگر دارای وضوح تضمین شدهای نیستند، به طوری که یک نقطه اعشاری دیگر معادل 0.01
نیست، بلکه 0.007874
خواهد بود که منجر به خطاهای گرد کردن مربوطه خواهد شد.
نوع تفسیری که استفاده میشود، در مکان استفاده مستند خواهد شد.
مقدارهای نقطه شناور یا گلیتکاما
اعداد اعشاری عبارات ریاضی پیچیدهتری هستند که در آنها یک عدد صحیح با دقت ثابت از طریق یک عبارت ریاضی بهگونهای بیان میشود که به طور مؤثر قسمت اعشاری با جابجایی تشکیل میشود - و به این ترتیب بهطور مستقیم به نماد علمی مرتبط است.
رایجترین روش برای پیادهسازی این موضوع با
IEEE 754 استانداردسازی شده و از آن زمان بهطور بینالمللی شناختهشده است.
بهطور کلی، یک عدد اعشاری از اجزای زیر تشکیل شده است:
علامت (0 یا 1 ) |
توان | مانتیس |
در حالی که علامت بهعنوان اطلاعات باینری بله/خیر به راحتی قابل استخراج است، عدد واقعی از طریق معادله
مانتیس * 2توان
تشکیل میشود.
علاوه بر این، تعدادی مقدار ثابت وجود دارد که موارد خاصی از اعداد گویا را پوشش میدهد - از جمله ±∞
و NaN
("عدد نامعتبر").
اعداد اعشاری بهویژه زمانی مفید هستند که دقت چندان مهم نباشد، زیرا در این نوع اعداد بهطور اجتنابناپذیری خطاهای گرد کردن و در نتیجه از دست دادن دقت به وجود میآید. بهطور معمول، اعداد اعشاری برای تعریف مختصات، مانند وکتورهای راس در مدلهای سهبعدی یا منحنیهای Bézier/Spline برای اهداف نمایشی نوری استفاده میشوند.
در فرمتهای داده، اعداد اعشاری بهعنوان float(مانتیس, توان)
مشخص میشوند.
اگر از فرمت متفاوتی از IEEE 754 استفاده شود، این موضوع بهطور مناسب ذکر میشود.