اعداد صحیح در 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
: اندازه ashort
یا بزرگتر (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
. امیدوارم با این کار از سردردی در این مسیر خلاص شوید.
از اینکه تا اینجا پیش رفتید متشکریم – دفعه بعد می بینمت!