C – ۱۰

انواع داده

ما در C دو نوع داده اصلی داریم و چند نوع داده فرعی که از این دو نوع داده اصلی مشتق شدن.

  1. نوع داده صحیح int
  2. نوع داده اعشاری float

این دو نوع داده بر روی کاغذ تفاوت آنچنانی ندارند بجر اینکه اعداد اعشاری یک قسمت بعد از ممیز دارند. اما در عالم کامپیوترها:

آن یکی شیر است اندر بادیه        آن دگر شیر است اندربادیه
آن یکی شیراست کآدم میخورد        وآن دگر شیر است کآدم میخورد

اما این فرق در کجا و تا کجاست؟ الان با یک مثال خدمتتون عرض میکنم:

اما:

در حقیقت این مثال کوچکی بود تا اصل ماجرا دستتون بیاد. محاسبه اعداد اعشاری گلوگاه هر کامپیوتریست و هنوزم که هنوزه و در اوایل سال ۲۰۱۹ بسر میبریم یکی از بنچمارکهای ابرکامپیوترها، همین محاسبه اعداد اعشاری(مثل عدد پی) است.
اما این تفاوت از کجا نشات میگیرد؟ قبل از هرگونه بحث راجع به انواع داده های مختلف و مشتقات آنها بهتره کمی در عمق فرو بریم و ببینیم که اصولا دخیره سازی اعداد صحیح و اعشاری در کامپیوترها چگونه است و چه تفاوتهایی با هم دارند.

در این قسمت هدف اینه که بدونیم که اعداد صحیح به طور کلی به چه شیوه ای در حافظه ذخیره میشوند.

اعداد صحیح به صورت مبنای ۲ در حافظه ذخیره میشوند، یعنی بصورت دودویی یا ۰ و ۱٫ خب تا اینجاش که آسون بود و میدونستیم. ازین ببعدشم آسونه. ما گفتیم که هر یک بایت هشت بیته یعنی هشت خانه. حالا بیایید ببینیم تعداد کل جایگشتها برای ۲ حالت(۰ و ۱) در هشت خانه چندتاست. در هر خانه ۲ حالت داریم که یا صفره یا یک. پس هر خانه ۲ حالت داره. هر بایت هم هشت بیته. تعداد کل حالاتی که میشه در این هشت خانه ۰ ها و ۱ ها را کنار هم چید برابر است با ۲×۲×۲×۲×۲×۲×۲×۲ یا ۲ به توان ۸ که مجموعا میشه ۲۵۶ حالت. این ۲۵۶ ماگزیمم عدد صحیحیه که در یک بایت میشه جا داد. اما یه نکته ای رو نباید فراموش کنیم. ما از ۱ شمردیم تا ۲۵۶. خیلی آسونه. شما انگشتاتونو بگیر جلو صورتتون. انگشتاتونو بشمرین از ۱ تا ۵ میشه. حالا اگه از صفر بشمرید(که کامپیوتر از ۰ میشمره) با ۵ انگشت میشه از ۰ تا ۴ شمرد. پس ما هم از ۲۵۶ یه دونه کم میکنیم. پس یک بایت میتونه مقادیری از ۰ تا ۲۵۵ یعنی از ۰ تا ۲ به توان ۸ منهای ۱ رو بپذیره.

اما این شرایط برای اعداد غیر منفی بود. برای اعداد منفی چی؟ اگر فکر کنید بیتی برای نگه داشتن علامت اعداد صحیح داریم سخت در اشتباهید. بریم ببینیم قضیه چیه:
همونطور که گفتیم در سیستمهای کامپیوتری بیتی برای حمل علامت نوع داده صحیح نداریم. یعنی مثل کاغذ نیست که کنارش یه منفی یا مثبت بنویسیم. در کامپیوترها از متمم ۲ استفاده میشه. چرا اسمش متمم ۲ است؟ چون متمم ۱ هم داریم ولی متدی که در اکثر کامپیوترهای امروزی رو بورسه متمم ۲ است. شیوه کار به چه صورت است؟ الان قشنگ خدمتتون عرض میکنم. اول از همه اینکه سیستم من ۶۴ بیتیه، پس من از عدد ۶۴ بیتی استفاده میکنم. اگر شما از سیستم ۳۲ بیتی استفاده میکنید از ۳۲ بیت استفاده کنید. برای اینکه کارمون مستند باشه و قابل فهم از شبیه ساز ترمینال استفاده میکنیم.

پس ما یه متغیر ۶۴ بیتی ساختیم. این متغیر ما در مبنای ۲ است. ۱۱ در مبنای ۲ برابر است با ۳ در مبنای ۱۰ زیرا:

۱ * ۲۱ + ۱ * ۲۰ = ۳

خب حالا ما میخوایم همین نتیجه رو در ترمینال بگیریم. با استفاده از دستور echo :

و مقدار ۳ رو در خروجی میبینیم. پس عدد ۶۴ بیتی ما ۳ بود در مبنای ۲. در اون متعیر ما میتونستیم اون همه صفرهای قبل از ۱۱ رو ننویسیم. اما برای جا افتادن مطلب من نوشتم.
خب شیوه متمم ۲ چگونه است؟ برای متمم ۲ گرفتن از یک عدد در مبنای ۲ باید ۲ مرحله رو بترتیب انجام بدیم:

۱- تمام ۱ ها رو به ۰ و تمام ۰ ها را به ۱ تبدیل کنیم. درنتیجه برای مثال خودمون به این صورت میشه:

۲- حالا همین عدد موجود رو با ۱ جمع میکنیم. در نتیجه داریم:

حالا بیاید دوباره TEST رو echo کنیم:

و چنانچه میبینید ترمینال عدد منفی ۳ رو بهمون نشون داد.
بطور کلی چنانچه در یک عدد مبنای ۲ با ارزشترین بیت(چپترین بیت) ۱ باشد آن عدد منفی و اگر ۰ بود آن عدد مثبت است.
همین متد رو میتونید برای اعداد دیگر نیز امتحان کنید.
خب الان شیوه ذخیره سازی اعداد صحیح رو در حافظه یاد گرفتیم. مقوله بعدی اینه که بدونیم اعداد اعشاری چگونه در حافظه ذخیره میشن و چه تفاوتهایی با ذخیره سازی اعداد صحیح دارند. اعداد اعشاری باحالترن.

درباره نویسنده: Hoshyar Karimi

مطالب زیر را حتما بخوانید

2 دیدگاه

  1. فوق العاده بود. دمت گرم. کلی چیز یاد گرفتم.
    اگه تونستی حتما ادامه بده!!!

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

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