داده ها در C
انواع داده ها در C :
انواع داده ها در C چیست؟
نوع داده نوعی داده است که به کامپایلر می گوید چه نوع داده ای قرار است در حافظه ذخیره شود. عمدتاً برای تعریف یک متغیر یا تابع در برنامه C استفاده می شود. نوع داده مشخصه ای است که به ماشین یا کامپیوتر یا میکروکنترلرها می گوید که چگونه مقدار را بخوانند و ذخیره کنند.
به بیان ساده تر، متغیر نام ناحیه ای از حافظه است. نوع داده، نوع داده ای است که باید در آن حافظه ذخیره شود.
int a = 15;
:متغیری از نوع int ذخیره شده است.
char b = ‘g’;
:متغیری از نوع کاراکتر ذخیره شده است.
float c = 9.7000000;
:- متغیری از نوع فلوت ذخیره شده است.
double d= 6.800300000000;
:-متغیری از نوع دابل ذخیره شده است.
کد زبر را اجرا نمایید :
#include <stdio.h> int main() { int age = 15; printf ("%d",a); return 0; }
در مثال بالا، سن (متغیر) نام حافظه است در واقع برچسبی که به محل ذخیره متغیر در حافظه اختصاص داده شده است. و int نوع داده است. یعنی در حافظه (متغیر age)، فقط اعداد صحیح را می توانیم ذخیره کنیم. همچنین در ادامه این آموزش خواهیم دید که چگونه مقادیر در حافظه ذخیره می شوند.
چرا از انواع داده در C استفاده می کنیم؟
انواع داده ها برای تعیین نوع داده هایی که قرار است در متغیرها نگهداری شوند استفاده می شود. هنگام ایجاد متغیر باید از انواع داده های مناسب استفاده کنیم. در ادامه این موضوع مهم رو به طور عمیق بررسی میکنیم.
انواع داده ها چیست ؟
انواع داده ها در C به سه دسته کلی تقسیم میشوند :
انواع داده ابتدایی یا پایه.
انواع داده های مشتق شده.
انواع داده های تعریف شده توسط کاربر.
خب بیاید با هم یکی یکی بررسیشون کنیم:
انواع داده های ابتدایی/پایه در C چیست؟
نوع داده پایه ابتدایی ترین نوع داده است که برای نمایش مقادیر ساده مانند عدد صحیح، کاراکتر، اعشاری، دوبل و void استفاده می شود.
داده نوع int (Integer):
عدد صحیح یا int یک عدد کامل است که شامل اعداد مثبت و منفی است. این نوع داده شامل اعداد اعشاری و کسری نمی شود.
Valid int values: -10, 0, 10, 23, 35, 2023.
Invalid int values: -1.43, 1 3/4, 3.14, .09, 5,643.1
اندازه نوع داده int می تواند 4 بایت در ماشین های 32 بیتی و 64 بیتی و 2 بایت در ماشین های 16 بیتی باشد. مقدار حافظه اختصاصی کاملا وابسته به سیستم است.
مثال :
;int temp_variable = 100
int age = 9;
int number = -14;
داده نوع char (Character) :
از کلمه کلیدی char برای ایجاد متغیری استفاده می شود که بتوانیم کاراکترها را در آن ذخیره کنیم. اندازه نوع داده char یک بایت است. بنابراین، می توانیم یک کاراکتر را در یک متغیر char ذخیره کنیم.
مثال :
char temp_char = 'T';
char initial = 's';
نوع داده float (Floating-Point) :
از آنجایی که int یا integer برای ذخیره اعداد کامل استفاده می شود، باید یک کلمه کلیدی جدید برای مقادیر اعشاری و کسری نیز داشته باشیم. نوع float یا شناور برای ایجاد فضای ذخیره سازی برای ذخیره مقادیر اعشاری استفاده می شود. اعداد اعشاری از دو قسمت تشکیل شده است، یک عدد کامل و یک جزء کسری. هر دو قسمت با یک نقطه اعشار از هم جدا می شوند.
به عنوان مثال، 16.56 یک عدد اعشاری است. در این عدد 16 جزء صحیح و 0.56 جزءاعشار است. به همین دلیل است که ما یک نوع داده جداگانه برای این نوع داده داریم. اندازه نوع داده شناور 4 بایت است. در این نوع داده float ، می توانیم 6 رقم اعشار را ذخیره کنیم.
به عنوان مثال :
float temp_variable = 2.39; //2.390000
float temp = 13.2324; //13.232400
نوع داده double (Double Precision Floating-Point) :
این کلمه کلیدی نیز همان کلمه کلیدی float میباشد. تنها تفاوت این است که می توانیم 15 رقم اعشار را ذخیره کنیم. از آنجایی که تعداد اعشار افزایش یافته است، اندازه نوع داده Double نیز 8 بایت است.
نوع داده void :
این نوع داده خالی یک نوع داده ناقص است. در زبان انگلیسی void به معنی فاصله یا حاوی هیچ چیز است. اندازه نوع داده void صفر بایت است. در اکثر کامپایلرها، هیچ اندازه ای (بایت) برای نوع داده خالی اختصاص داده نشده است، اما در تعداد کمی از کامپایلرها مانند GCC، اندازه آن 1 بایت است.
معمولا متغیر را با استفاده از void تعریف نمی کنیم. از void بیشتر برای اشاره گرها ( void pointers ) استفاده می شود. و همچنین از آن در توابعی استفاده میکنیم که چیزی برمیگردانند و توابعی که هیچ آرگومان نمیگیرند.
/* Function with no return and no argument */ void temp_function( void ) { /* code here */ } /* void pointer */ void *ptr;
در جدول زیر میتوانید خلاصه انواع داده پایه را مشاهده نمایید :
تعیین کننده فرمت | سایز (Byte) | نوع داده |
---|---|---|
d-%i% | 2 یا 4 بایت | int |
c% | 1 بایت | char |
f% | 4 بایت | float |
lf% | 8 بایت | double |
– | 0 یا 1 بایت | void |
انواع داده های مشتق شده در برنامه نویسی C چیست؟ :
نوع دادههای مشتقشده از انواع دادههای اولیه یا پایه که در بالا بحث کردیم، مشتق شدهاند. انواع داده های مشتق شده عبارت اند از :
Arrays
Functions
Pointers
در آموزشهای بعدی در مورد انواع داده مشتق شده صحبت خواهیم کرد.
انواع داده های تعریف شده توسط کاربر چیست؟
این ها انواع داده هایی هستند که توسط خود کاربر با ترکیب انواع داده های اولیه/پایه و انواع داده های مشتق شده تعریف می شوند. کاربر برای سفارشی کردن یا ایجاد انواع داده های جدید بر اساس نیاز خود در برنامه آزاد است.
Structures
Unions
Enums
ساختار یا structure چیست؟
ساختار مجموعه ای از متغیرها از نوع داده های مشابه یا متفاوت است. بنابراین، ما می توانیم بسته ای از انواع داده های مختلف را در تحت عنوان یک نوع جدید داده ایجاد کنیم.
به عنوان مثال میخواهیم نوع جدیدی از داده را تعریف کنیم که در آن بتوانیم سوابق یک دانش آموز مانند نام،شماره دانش آموزی،نمره و موارد دیگر را ذخیره کنیم.برای این منظور از نوع داده ساختار استفاده میکنیم.
struct student { char name[20]; int id; int roll_no; float marks; };
در آموزشهای بعدی به طور عمیق تر در مورد ساختارها بحث خواهیم کرد.
نوع شمارشی چیست؟
enum نوع خاصی است که نشان دهنده گروهی از ثابت ها (مقادیر غیرقابل تغییر) است.
برای ایجاد enum از کلمه کلیدی enum و به دنبال آن نام enum استفاده کنید و موارد enum را با کاما جدا کنید.
enum cars { Bmw=0, Ferrari=2, Jeep=3, Mercedes-Benz=5 }
اصلاح کننده های نوع داده :
تغییر دهنده نوع داده یکی از کلیدواژه های زبان C است که برای اصلاح موارد زیر از انواع داده های اولیه یا ابتدایی استفاده می شود.
-
-
- محدوده انواع داده ها.
- اندازه فضای حافظه اختصاص داده شده به متغیر.
-
در زبان C، اصلاح کننده های نوع داده زیر موجود است.
اصلاح کننده های نوع داده در C :
-
-
- short
- long
- signed
- unsigned
-
برای تغییر اندازه متغیرها از اصلاح کننده های نوع داده کوتاه و بلند استفاده می شود. Short برای کاهش اندازه حافظه متغیر و long برای افزایش حافظه متغیر استفاده می شود.
برای تغییر علامت (مثبت یا منفی) متغیرها از کلیدواژه های signed و unsignedاستفاده می شود. اگر از کلمه کلیدی signed استفاده کنیم، آن متغیر می تواند اعداد مثبت (+ve) و منفی (-ve) را در خود جای دهد. اگر از کلمه کلیدی unsigned استفاده کنیم، متغیر فقط می تواند اعداد مثبت (+ve) را نگه دارد.
توجه: اگر قبل از نوع داده از کلمه کلیدی signed یا unsigned استفاده نکنیم، کامپایلر به طور پیشفرض از اصلاحکننده نوع داده signed در طول کامپایل استفاده میکند.
ما می توانیم این اصلاح کننده های نوع داده را قبل از انواع داده ها اضافه کنیم. و همچنین ما می توانیم اصلاح کننده ها را ترکیب کنیم.
در زیر مثالهایی از ترکیب انواع اصلاح کننده که با یکدیگر ترکیب شده اند آورده شده است .
signed int
signed char
unsigned int
unsigned char
signed short int
signed long int
signed long long int
unsigned short int
unsigned long int
unsigned long long int
long double
چگونه محدوده متغیر را پیدا می کنیم؟:
این بخش رو با یک مثال توضیح میدم.
کاراکتر بدون علامت را در نظر بگیریم که 8 بیت نیاز دارد. اگر همه بیت ها را با 0 پر کنیم، مقدار آن حداقل است.و اگر همه بیت ها را تا 1 پر کنیم، مقدار حداکثر آن حداکثر میشود.
حداقل مقدار کاراکتر بدون علامت (8 بیت) :
Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 (MSB) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
مقدار 8 بیت فوق 0 است. پس حداقل مقدار 0
حداکثر مقدار کاراکتر بدون علامت (8 بیت) است.
حداقل مقدار کاراکتر بدون علامت (8 بیت) :
Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 (MSB) |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
مقدار 8 بیتی بالا 255 است. بنابراین، حداکثر مقدار کاراکتر بدون علامت 255 است.به ساده گی می توانیم از فرمول زیر برای محاسبه حداکثر مقدار استفاده کنیم.
maximum value = ( 2^available bits to store the data ) - 1
برای کاراکتر بدون علامت، فرمول به صورت زیر خواهد بود،
maximum value = 2^8 – 1 = 255.
در مورد کاراکتر علامت دار به چه صورت خواهد بود؟ از آنجایی که بیت 7 (MSB) برای ذخیره علامت استفاده خواهد شد، تنها 7 بیت (بیت 0 تا بیت 6) برای ذخیره داده ها دارد. حداکثر مقدار = 2^7 – 1 = 127. بنابراین، میتوانیم دادههایی را ذخیره کنیم که از 127- تا 127+ است. به این ترتیب، ما می توانیم انواع داده های دیگر را محاسبه کنیم.
از کد زیر میتوانید برای دیدن سایز انواع داده ها استفاده نمایید.
#include <stdio.h> void main() { printf("sizeof char is: %d bytes \n", sizeof(char)); printf("sizeof unsigned char is: %d bytes \n", sizeof(unsigned char)); printf("sizeof int is: %d bytes \n", sizeof(int)); printf("sizeof unsigned int is: %d bytes \n", sizeof(unsigned int)); printf("sizeof short int is: %d bytes \n", sizeof(short int)); printf("sizeof unsigned short int is: %d bytes \n", sizeof(unsigned short int)); printf("sizeof float is: %d bytes \n", sizeof(float)); printf("sizeof double is: %d bytes \n", sizeof(double)); printf("sizeof void is: %d bytes \n", sizeof(void)); printf("sizeof long is: %d bytes \n", sizeof(long)); printf("sizeof unsigned long is: %d bytes \n", sizeof(unsigned long)); printf("sizeof long double is: %d bytes \n", sizeof(long double)); printf("sizeof long long is: %d bytes \n", sizeof(long long)); printf("sizeof long int is: %d bytes \n", sizeof(long int)); printf("sizeof long long int is: %d bytes \n", sizeof(long long int)); }
خروجی برنامه بالا به صورت زیر میباشد.
sizeof char is: 1 bytes sizeof unsigned char is: 1 bytes sizeof int is: 4 bytes sizeof unsigned int is: 4 bytes sizeof short int is: 2 bytes sizeof unsigned short int is: 2 bytes sizeof float is: 4 bytes sizeof double is: 8 bytes sizeof void is: 1 bytes sizeof long is: 8 bytes sizeof unsigned long is: 8 bytes sizeof long double is: 16 bytes sizeof long long is: 8 bytes sizeof long int is: 8 bytes sizeof long long int is: 8 bytes
امیدوارم انواع داده ها را به خوبی درک کرده باشید. حال می خواهیم ببینیم که چگونه مقادیر توسط متغییرها در حافظه با انواع داده های مختلف ذخیره می شوند.
چگونه داده ها در حافظه ذخیره می شوند؟:
ابتدا ببینیم که مقادیر بدون علامت چگونه در حافظه ذخیره می شوند.
مقادیر بدون علامت :
برای این مثال، char بدون علامت که اندازه آن 8 بیت است را در نظر می گیریم. این مثال بسیار ساده و سرراست میباشد.
unsigned char a = 'S';
مقدار اسکی “S” برابر با 0x53 است. بنابراین، داده ها مانند زیر ذخیره می شوند.
حداقل مقدار کاراکتر بدون علامت (8 بیت) :
Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 (MSB) |
1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
به این ترتیب، تمام مقادیر بدون علامت مانند، int بدون علامت، مقادیر long بدون علامت نیز به همین ترتیب ذخیره میشوند.
مقادیر علامت دار:
برای این سناریو نیز char علامت دار (unsigned char) را در نظر خواهیم گرفت که اندازه آن 8 بیت خواهد بود. MSB برای ذخیره علامت و 7 بیت باقی مانده برای ذخیره داده ها استفاده می شود. بنابراین، می توانیم اعداد مثبت و منفی را از 127- تا 127 ذخیره کنیم.
اعداد مثبت مستقیماً در حافظه نمایش داده می شوند در حالی که اعداد منفی به صورت مکمل 2 نشان داده می شوند.
مثال زیر را در نظر بگیرید.
unsigned char a = -21;
از آنجایی که مقدار فوق یک عدد منفی است، به صورت مکمل 2 در حافظه ذخیره میگردد.
21 = 0001 0101 ~21 = 1110 1010 ~21 + 1 = 1110 1011 -21 = 1110 1011
حداقل مقدار کاراکتر بدون علامت (8 بیت) :
Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 (MSB) |
1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
مقدار 21- مانند بالا در حافظه ذخیره می شود. به این ترتیب مقادیر علامت دار شده را میتوان در حافظه ذخیره نمود.
مقادیر float و double :
عدد ممیز شناور مستقیماً در حافظه ذخیره نمی شود. بنابراین باید اعداد ممیز شناور به شکل استاندارد تبدیل شوند و سپس آن اعداد باینری تبدیل شده در حافظه ذخیره می شوند. نمایش نقطه شناور ممکن است از ماشینی به ماشین دیگر متفاوت باشد. در این آموزش به یکی از روش های استاندارد به نام نمایش عدد ممیز شناور IEEE 754 می پردازیم.
نمایش استاندارد IEEE 754:
طبق تعریف ویکی پدیا، استاندارد IEEE برای محاسبات ممیز شناور (IEEE 754) یک استاندارد فنی برای محاسبات ممیز شناور است که در سال 1985 توسط موسسه مهندسین برق و الکترونیک (IEEE) ایجاد شد. این استاندارد بسیاری از مشکلات موجود در پیادهسازیهای ممیز شناور مختلف را برطرف میکند که استفاده قابل اعتماد و قابل حمل از آنها را دشوار میکرد. بسیاری از واحدهای ممیز شناور سخت افزاری از استاندارد IEEE 754 استفاده می کنند. این فرمت IEEE 754 دارای سه جزء است.
-
-
- قسمت علامت
- قسمت نما
- قسمت مانتیس
-
قسمت علامت 1 بیت را اشغال می کند که برای تشخیص عدد مثبت (+ve) یا منفی (-ve) استفاده می شود.
اندازه شناور 4 بایت و دوبل 8 بایت است. به دو فرمت طبقه بندی می شود.
انواع داده float به صورت single precision که 32 بیت فضا اشغال میکند.
نوع داده float به صورت double precision که 64 بیت فضا در حافظه اشغال میکند.
سوالات متداول :
-
انواع داده ها در C:
انواع داده در زبان C به انواع مختلفی از داده ها اشاره دارد که می توان از آنها برای ذخیره و دستکاری اطلاعات در زبان برنامه نویسی استفاده کرد. در C، انواع داده ها شامل اعداد صحیح، اعداد ممیز شناور، کاراکترها و اشاره گرها و غیره است. این نوع داده ها اندازه و قالب داده ها و همچنین عملیاتی را که می توان بر روی آنها انجام داد را تعیین می کند. درک انواع داده ها برای نوشتن برنامه های C موثر و کارآمد ضروری است.
-
انواع داده ها در C چیست؟
سه نوع نوع داده در زبان برنامه نویسی C وجود دارد:
1-انواع داده های اولیه/ پایه
2-انواع داده های مشتق شده
3-انواع داده های تعریف شده توسط کاربر
-
انواع داده های اولیه یا اولیه در C چیست؟
این نوع داده ابتدایی ترین نوع داده است که برای نمایش مقادیر ساده مانند عدد صحیح، کاراکتر، شناور، دوبل و void استفاده می شود.
-
انواع داده های مشتق شده در C چیست؟
این نوع داده های مشتق شده از انواع داده های اولیه یا پایه مشتق شده اند. انواع داده های مشتق شده هستند
آرایه ها
توابع
اشاره گرها
-
انواع داده های تعریف شده توسط کاربر در C چیست؟
این ها انواع داده هایی هستند که توسط خود کاربر با ترکیب انواع داده های اولیه/پایه و انواع داده های مشتق شده تعریف می شوند. کاربر برای سفارشی کردن یا ایجاد انواع داده های جدید بر اساس نیاز خو د میتواند از این نوع از داده ها استفاده کند.
Structures-
Unions-
Enums
-
اصلاح کننده های نوع در C چیست؟
اصلاح کننده نوع داده در C کلمات کلیدی هستند که می توانند برای تغییر رفتار یک نوع داده استفاده شوند. آنها می توانند محدوده مقادیری را که یک متغیر از یک نوع داده خاص می تواند نگه دارد تغییر دهند یا بر تخصیص حافظه برای آن متغیر تأثیر بگذارند. نمونههایی از اصلاحکنندههای نوع در C عبارتند از: “signed”، “unsigned”، “short” و “long”.
در قسمت بعدی آموزش زبان برنامه نویسی C به بررسی متغیرها در زبان برنامه نویسی C خواهیم پرداخت.