انواع داده (C Data Types)
انواعِ داده در C: طبقهبندیِ دقیقِ اطلاعات 📋🧬
C یک زبانِ Statically Typed است، یعنی نوعِ دادهیِ هر متغیر باید در زمانِ کامپایل مشخص باشد. انتخابِ صحیحِ نوعِ داده باعثِ بهینهسازیِ مصرفِ رم میشود.
انواعِ دادهیِ پایه (Basic Types):
<th style="padding: 10px; border: 1px solid rgba(255,255,255,0.1);">نوع</th> <th style="padding: 10px; border: 1px solid rgba(255,255,255,0.1);">اندازه (بایت)</th> <th style="padding: 10px; border: 1px solid rgba(255,255,255,0.1);">توضیح</th>| int | 2 or 4 | اعداد صحیح |
| float | 4 | اعداد اعشاری (دقتِ ۷ رقم) |
| double | 8 | اعداد اعشاری (دقتِ ۱۵ رقم) |
| char | 1 | تک کاراکتر / کد ASCII |
اصلاحکنندهها (Type Modifiers):
با استفاده از کلماتِ کلیدی میتوانید رفتارِ نوعِ داده را تغییر دهید:
signed/unsigned: برایِ تعیینِ داشتنِ علامت (مثبت و منفی) یا فقط مثبت بودن.short/long: برایِ تغییرِ محدودهیِ اعداد.
double برایِ محاسباتِ حساسِ مهندسی استفاده کنید، چون دقتِ آن دو برابرِ float است. float فقط زمانی خوب است که محدودیتهایِ شدیدِ حافظه دارید (مثل میکروکنترلرها).
بخش تخصصی: مهندسیِ متغیرها و مدیریتِ حافظه 🧱⚙️⚡
در زبانِ C، متغیرها فقط نامهایی برایِ سادهسازی نیستند؛ آنها نمایندهیِ آدرسهایی در حافظهیِ فیزیکی (RAM) هستند. درکِ نحوهیِ ذخیرهسازیِ دادهها، مرز بینِ یک کدنویسِ معمولی و یک توسعهدهنده سیستم است.
۱. ترتیبِ بایتها (Endianness)
وقتی یک عددِ ۴ بایتی (مثل int) در حافظه ذخیره میشود، بایتها به چه ترتیبی قرار میگیرند؟
- Little-Endian: بایتِ کمارزش در آدرسِ کمتر ذخیره میشود (رایج در پردازندههای x86 و ARM).
- Big-Endian: بایتِ پُرارزش در آدرسِ کمتر ذخیره میشود (رایج در شبکهها و برخی پردازندههای قدیمی).
۲. نمایشِ اعدادِ اعشاری (IEEE 754)
اعدادِ اعشاری در C (مثل float و double) بر اساسِ استانداردِ IEEE 754 ذخیره میشوند. این استاندارد عدد را به سه بخش تقسیم میکند:
- Sign (علامت): ۱ بیت برای مثبت یا منفی بودن.
- Exponent (توان): برای مشخص کردنِ بزرگیِ عدد.
- Mantissa (مانتیس): برای مشخص کردنِ دقتِ عدد.
۳. کلاسهایِ ذخیرهسازی (Storage Classes)
هر متغیر در C علاوه بر "نوع"، یک "کلاسِ ذخیرهسازی" هم دارد که طولِ عمر و حوزهیِ دسترسیِ آن را مشخص میکند:
auto: پیشفرض برای متغیرهای محلی.statice: مقدارِ خود را بینِ فراخوانیهایِ تابع حفظ میکند.extern: برای دسترسی به متغیری که در فایلِ دیگری تعریف شده است.register: به کامپایلر پیشنهاد میدهد متغیر را در ثباتهایِ CPU نگه دارد (برایِ سرعتِ فوقالعاده).
sizeof() برای پیدا کردنِ اندازهیِ واقعیِ یک متغیر در سیستمِ خود استفاده کنید. اندازهیِ int در یک سیستمِ ۱۶ بیتی با یک سیستمِ ۶۴ بیتی میتواند متفاوت باشد!
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
خروجیِ تابع sizeof(char) را با استفاده از printf چاپ کنید.
#include <stdio.h>
int main() {
printf("%lu", sizeof(char));
return 0;
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.