برنامه نویسی

اعداد صحیح در C: بیتی از تاریخ

اعداد صحیح بنیادی ترین ساختار داده در محاسبات هستند – اگر حتی بتوانیم آنها را “ساختار” بنامیم. وظیفه ما به عنوان برنامه نویس معنی دادن به این اعداد است. مهم نیست که نرم افزار چقدر پیچیده است: در نهایت، این فقط یک عدد صحیح است و پردازنده شما فقط اعداد صحیح را درک می کند.

اگر به اعداد منفی نیاز داریم، ما اختراع کردیم مکمل دو. اگر به اعداد کسری نیاز داشته باشیم، نوعی نماد علمی ایجاد می کنیم و – بوم – یک شناور داریم. در پایان روز، هیچ راه گریزی از صفر و یک وجود ندارد.


تاریخچه کوچک اعداد صحیح

در سی، int تقریباً از نوع طبیعی است. اگرچه کامپایلرها ممکن است شکایت کنند، اما با چند پرچم اینجا و آنجا، بیشتر به شما اجازه می دهند چیزی شبیه به این بنویسید:

main(void) {
    return 0;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از نظر فنی، این همان است:

int main(void) {
    return 0;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این رفتار از زمانی ناشی می شود که عقل سلیم فرض می کرد که اگر برنامه نویس یک نوع را مشخص نکرده باشد، منطقی است که پیش فرض یک عدد صحیح باشد.

C با این ایده طراحی شده است. در ابتدا، int اندازه استاندارد نداشت این PDP-11 پردازنده – ماشینی که C در ابتدا برای آن ساخته شد – از آدرس دهی 16 بیتی استفاده می کرد. بنابراین فرض بر این بود که برای یک منطقی است int همچنین 16 بیتی باشد. ایده این بود که اندازه int با تکامل پردازنده ها رشد خواهد کرد.

اندازه مرموز

این رویکرد مشکلاتی را ایجاد کرد. اگر اندازه از int بین پلتفرم ها متفاوت است، برنامه های کامپایل شده برای پردازنده های مختلف می توانند رفتار متفاوتی داشته باشند. این باعث شد که زبان C یک زبان «آگنوستیک» باشد که در معماری‌های مختلف کامپایل می‌شود.

بر خلاف int، charبه عنوان مثال، همیشه یک اندازه کاملاً مشخص داشت: 8 بیت، امضا شده. با وجود نامش، char یک نوع انتزاعی برای کاراکترهای متنی نیست. این فقط یک عدد 8 بیتی است. مثلا لفظی 'a' در زمان کامپایل به عدد تبدیل می شود 97، ساده و ساده

و در مورد انواع دیگر، مانند short و long? ایده ساده بود:

short <= int <= long
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیاده‌کننده‌های کامپایلر در تصمیم‌گیری در مورد اندازه‌های خاص آزادی کامل داشتند.

ANSI C (1989) مقداری نظم را به ارمغان می آورد

با ANSI C استاندارد، برخی از قوانین ایجاد شده است:

  • char: حداقل 8 بیت
  • short: حداقل 16 بیت
  • int: اندازه a short یا بزرگتر (16 یا 32 بیت)
  • long: حداقل 32 بیت

این سازمان کمک کرد، اما اندازه int حداقل گیج کننده باقی ماند. اوضاع با C99 استاندارد، که معرفی شد stdint.h هدر

اکنون انواع با اندازه ثابت داریم:

  • int8_t: 8 بیت
  • int16_t: 16 بیت
  • int32_t: 32 بیت
  • int64_t: 64 بیت

از آن به بعد، اجرای این هدر با انواع با اندازه ثابت به عهده کامپایلر بود.


وضعیت فعلی اعداد صحیح

امروزه با کامپایلرهای مدرن مانند شورای همکاری خلیج فارس و زنگ زدن، اندازه ها قابل پیش بینی تر هستند:

تایپ کنید اندازه
char 8 بیت
short 16 بیت
int 32 بیت
long 64 بیت (32 بیت در سیستم های 32 بیتی)
long long 64 بیت

هر چند long long هنوز هم تا حدودی عجیب و غریب است، حداقل یک انسجام به ارمغان می آورد (حتی من می بینم long long شیک، صادقانه بگویم).


چه باید کرد؟

امروز، ما به خوبی با هدرهایی مانند stddef.h و stdint.h. استفاده کنید int فقط در صورت لزوم، مانند نوع برگشتی main تابع برای هر چیزی فراتر از نمونه سازی، ترجیح دهید از اعداد صحیح با اندازه ثابت استفاده کنید stdint.h، و برای شاخص ها یا حلقه های آرایه، استفاده کنید size_t از stddef.h. امیدوارم با این کار از سردردی در این مسیر خلاص شوید.

از اینکه تا اینجا پیش رفتید متشکریم – دفعه بعد می بینمت!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا