توی زبان C فقط چند نوع دادهی پایه داریم:
char → یه بایت تکی (single byte) که میتونه یه کاراکتر از مجموعهی کاراکترهای محلی رو نگه داره
int → یه عدد صحیح (integer) که معمولاً اندازهاش متناسب با نوع پردازندهی سیستم میزبان انتخاب میشه
float → عدد اعشاری با دقت معمولی (single-precision floating point)
double → عدد اعشاری با دقت دو برابر (double-precision floating point)
علاوه بر این نوعهای پایه، یه سری توصیفگر (qualifier) هم داریم که میتونیم بهشون اضافه کنیم. مثلاً short و long برای عددهای صحیح استفاده میشن:
short int sh;
long int counter;
تو این نوع تعریفها معمولاً لازم نیست بنویسیم int، یعنی میتونیم فقط بنویسیم short sh; یا long counter; و کامپایلر خودش میفهمه.
هدف از وجود short و long اینه که بتونیم طولهای مختلفی از عددهای صحیح داشته باشیم (هرجا که ممکنه). معمولاً int اندازهی طبیعی عدد روی اون ماشین خاصه.
در خیلی از سیستمها short برابر ۱۶ بیت و int یا ۱۶ یا ۳۲ بیتیه.
هر کامپایلر بسته به سختافزار خودش میتونه اندازهها رو تعیین کنه، فقط باید به یه سری محدودیتها پایبند بمونه:
-
short و int باید حداقل ۱۶ بیتی باشن
-
long باید حداقل ۳۲ بیتی باشه
-
short نمیتونه بزرگتر از int باشه، و int هم نمیتونه بزرگتر از long باشه
توصیفگرهای signed و unsigned هم میتونن به نوع char یا هر نوع عدد صحیحی اضافه بشن.
عددهای unsigned همیشه صفر یا مثبت هستن و طبق قوانین محاسبات پیمانهای (modulo 2ⁿ) رفتار میکنن؛ یعنی n برابر تعداد بیتهای اون نوع داده است.
مثلاً اگه char روی یه سیستم ۸ بیتی باشه:
-
unsigned char عددهایی بین ۰ تا ۲۵۵ نگه میداره
-
signed char عددهایی بین -۱۲۸ تا +۱۲۷
(این حالت تو سیستمهایی که از نمایش دو مکمل یا two’s complement استفاده میکنن رایجه.)
اینکه یه char معمولی (char بدون signed یا unsigned) خودش signed باشه یا unsigned، بستگی به سیستم داره، ولی کاراکترهای قابل چاپ همیشه مقدار مثبت دارن.
نوع long double هم برای اعداد اعشاری با دقت بیشتر (extended-precision floating point) استفاده میشه.
مثل نوعهای عدد صحیح، اندازهی متغیرهای اعشاری هم به پیادهسازی (implementation) بستگی داره — یعنی float، double و long double ممکنه سه اندازهی متفاوت یا حتی یکی باشن.
سربرگهای استاندارد <limits.h> و <float.h> شامل یه سری ثابت نمادین (symbolic constants) هستن که اندازهی دقیق این نوع دادهها و ویژگیهای سختافزار و کامپایلر رو نشون میدن. دربارهی اینا تو ضمیمهی B بیشتر توضیح داده شده.
تمرین ۱-۲:
یه برنامه بنویس که محدودهی مقدار (range) نوعهای char، short، int و long رو — هم signed و هم unsigned — مشخص کنه.
مقادیر رو هم از طریق سربرگهای استاندارد چاپ کن و هم با محاسبهی مستقیم بهدست بیار.
برای چالش بیشتر، محدودهی نوعهای عدد اعشاری (float, double, long double) رو هم خودت حساب کن.