ویرگول
ورودثبت نام
صالح ترکانلو
صالح ترکانلو
صالح ترکانلو
صالح ترکانلو
خواندن ۷ دقیقه·۸ ماه پیش

اعداد تو کامپیوتر چطوری نمایش داده میشن؟ راهنمای ساده برای Unity کارها

اگه شما هم با Unity بازی میسازین و با زبان C# سر و کار دارین، احتمالاً با نوع دادههایی مثل 𝚒𝚗𝚝, 𝚜𝚑𝚘𝚛𝚝, 𝚋𝚢𝚝𝚎, 𝚕𝚘𝚗𝚐 و بقیه روبه رو شدین. ولی واقعاً تا حالا به این فکر کردین که این عددها چطوری داخل حافظهی کامپیوتر ذخیره میشن؟ یعنی مثلاً وقتی مینویسیم ;𝚒𝚗𝚝 𝚡 = 𝟺𝟻 واقعا چه اتفاقی پشت صحنه می افته؟

ممکنه فکر کنیم اینا فقط اسمهای مختلف برای عدد هستن، ولی حقیقت اینه که هر کدوم از این نوع دادهها، با تعداد مشخصی بیت در حافظه نمایش داده میشن و این موضوع میتونه توی دقت، حافظه مصرفی و حتی بروز باگهای عجیب توی بازیمون تاثیر مستقیم داشته باشه.

در این مقاله میخوایم با زبون خیلی ساده و مثالمحور، یه نگاه دقیق بندازیم به اینکه:

  • عددها توی کامپیوتر چطور نمایش داده میشن؟
  • چرا بهشون میگن 8 بیتی یا 32 بیتی؟
  • چه تفاوتی بین 𝚋𝚢𝚝𝚎 و 𝚒𝚗𝚝 هست؟
  • و اصلاً این مفاهیم به چه درد ما برنامهنویسهای بازی میخوره؟

پس اگه تا حالا سوالاتی مثل "توی کامپیوتر عدد منفی چطوری ذخیره میشه؟" یا "چرا بعضی وقتا عدد ما Overflow میکنه؟" برات پیش اومده، این مقاله قراره خیلی از این ابهاما رو برات روشن کنه.

برای چی باید بدونیم اینارو؟

ممکنه برات پیش بیاد که توی کد Unity با خطاهایی مثل Overflow یا Underflow مواجه بشی، به طوری که عددی از نوع دادهای که برای ذخیرهسازی انتخاب کردی، از حد ظرفیتش فراتر میره و باعث میشه برنامه درست کار نکنه. این مشکلات ممکنه در موقعیتهای مختلفی به وجود بیان، مثل وقتی که با اعداد بزرگ توی بازیها سر و کار دارید یا تعداد زیادی Object وجود داره که محاسبات زیادی داخلشون انجام میگیره.
مثلاً تصور کن یک سیستم امتیازدهی توی بازی داری که وقتی یک بازیکن امتیاز خاصی رو میگیره، مقدار int استفادهشده برای ذخیرهسازی امتیاز، به حد نهایی خودش میرسه و باعث Overflow میشه. در این حالت، ممکنه نتیجهای که از برنامه انتظار داری اصلاً بهدرستی نمایش داده نشه و مثلاً امتیاز بازیکن از حد نرمال بیشتر بشه یا برعکس!

این مشکل به همین سادگی برطرف نمیشه، چون ممکنه در پسزمینهی کد، باعث ایجاد خطاهای پیچیدهای بشه که در نگاه اول اصلاً به چشم نیان. برای همین، درک این که اعداد توی حافظه چطور ذخیره میشن و چه محدودیتهایی دارن، بهت کمک میکنه تا بتونی از اینجور مشکلات جلوگیری کنی و برنامهت رو بهینهتر بنویسی.

در این مقاله قراره توضیح بدیم که عددها چطور داخل حافظه ذخیره میشن و چرا باید بدونیم چطور انواع مختلف دادهها مثل byte و int روی حافظه تاثیر میذارن.

روش های مختلف نمایش اعداد

قبل از اینکه بریم سراغ اینکه اعداد توی کامپیوتر چجوری نمایش داده میشن، بد نیست یه نگاهی بندازیم به اینکه اصلاً آدمها چطوری عددها رو توی طول تاریخ نمایش میدادن.

قدیما وقتی هنوز سیستم عددیای وجود نداشت، انسانها از چیزهایی مثل سنگ، چوب یا خط کشیدن روی دیوار غار برای شمردن استفاده میکردن. هر علامت یا شیء نشونهی یه واحد بود. مثلاً برای نشون دادن عدد ۳، سه تا خط کنار هم میکشیدن. ساده، ولی خیلی محدود و سخت بود.

بعدها با پیشرفت تمدنها، سیستمهای عددی پدید اومدن. یکی از معروفترین و پرکاربردترینهاش همونیه که ما الان استفاده میکنیم: سیستم دهدهی (Decimal System). این سیستم بر پایهی عدد ۱۰ ساخته شده، یعنی از ۰ تا ۹ دهتا رقم داریم، که اعداد بیشتر از 9 رو با اینکه چقدر توشون 10 دارن نشون میدیم مثلا:

مثال های  نمایش اعداد در سیستم ده دهی
مثال های نمایش اعداد در سیستم ده دهی

همونجور که توی هر عدد میبینید تمام عبارت ها (که با + از هم جدا شدند) با استفاده از اعداد عدد 10 و ارقام 1 تا 9 درست میشن که حاصل جمعشون در نهایت میشه عددی که میخایم نمایش بدیم.

خب حالا شاید با خودت بگی:
«باشه بابا! فهمیدیم که 121 میشه2 × 10² + 2 × 10¹ + 1 × 10⁰، ولی قراره هر بار بخوام یه عدد ساده رو اینجوری بنویسم؟ پس کی برسم به اصل کار؟!» 😅

یا مثلا هرموقع که میخاستیم توی کدد عدد بنویسیم اینجوری مینوشتیم:

int bad123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0; Debug.Log (I hate numbers😭);

و راست هم میگی! اگه قرار بود برای هر عددی همچین تشریفاتی بچینیم، نه تنها وقت کم میاوردیم، بلکه دفترمونم پر از توان و ضرب و جمع میشد!

اینجاست که اون سیستم خلاصه و جمعوجور وارد میشه؛ همون عددی که ما بهش میگیم:
"نمایش معمولی" یا همون عدد ساده مثل 21، 309 یا 4892

در واقع وقتی مینویسیم 21، داریم به طور خلاصه همون مفهوم 2 × 10¹ + 1 × 10⁰ رو منتقل میکنیم. فقط با زبون سادهتر و برای مغز راحتتر!
یعنی اگه دقت بکنی داریم توی نمایش دادن، علامت های + و × و 10 ها رو پاک میکنیم و همون ارقام 1 تا 9 باقی میمونه مثلا:

مختصر نویسی اعداد در سیستم ده دهی
مختصر نویسی اعداد در سیستم ده دهی


پس اگه یه عدد مثل 4 رقمی 5832 در سیستم ده دهی ببینی، بدون که در دلش همین ساختار خوابیده:

5832 = 5 × 10³ + 8 × 10² + 3 × 10¹ + 2 × 10⁰

خوب اگه فهمیدی، حدس بزن ساختار درونی عدد 3058 چیه؟

افرین که درست گفتی میشه:

3058 = 3 × 10³ + 0 × 10² + 5 × 10¹ + 8 × 10⁰

حالا که حسابی با سیستم دهدهی رفیق شدیم و فهمیدیم این عددهای سادهی ظاهراً بیآزار، پشتشون یه عالمه توان و ضرب و جمع خوابیده، وقتشه یه چیز باحالتر رو بشناسیم!

ببین، ما آدما چون ده تا انگشت داریم، سیستم دهدهی برامون طبیعی شده. ولی کامپیوتر بینوا که نه انگشت داره، نه حس داره، چیکار کنه؟! 😅
اون بندهخدا فقط دوتا چیز حالیشه: روشن و خاموش... یعنی 1 و 0!

پس اگه تا اینجای کار عددهای دهدهی رو قشنگ قورت دادی، باید بهت تبریک بگم، چون وارد دنیای خاص باینری شدی از اینجا به بعدش یه بازی شیرین میشه.
بزن بریم سراغ سیستم باینری؛ همون زبون مرموزی که مغز کامپیوتر باهاش فکر میکنه...

وقتی 13 میشه 1101! رمزگشایی از اعداد باینری

خب حالا میخوایم عدد 13 رو تو کامپیوتر ذخیره کنیم و برای این کار به جای ارقام 0 تا 9 فقط رقم های 0 و 1 رو داریم، مثلاً عدد 13 توی دنیای باینری میشه 1101. ولی چطور؟ بیا مرحله به مرحله از دودویی یا به انگلیسی باینری (binary) به دهدهی تبدیلش کنیم ...

قبلش به این جدول کوچیک نگاه بنداز:

جدول اعداد دهدهی و معادل باینری
جدول اعداد دهدهی و معادل باینری


یادته گفتم سیستم باینری کاملاً شبیه سیستم دهدهیه؟
پس حالا به ساختار درونی عدد ۱۳ توی هر دو سیستم دقت کنید:

🧮 توی سیستم دهدهی (Decimal):

13 = 10¹ * 1 + 10⁰ * 3

یعنی عدد 13 از دو بخش ساخته شده:
یک «۱» در جایگاه دهگان (۱۰¹) و یک «۳» در جایگاه یکان (۱۰⁰).
ساده و آشنا، نه؟

💡 حالا بریم سراغ باینری:

🖥️ توی سیستم دودویی (Binary):

13 = 2³ * 1 + 2² * 1 + 2¹ * 0 + 2⁰ * 1

حالا دقت کن!
در هر عبارت (که با + جدا شدن)، دقیقاً مثل دهدهی یه رقم ضربدر یه پایه شده:

  • توی دهدهی: پایهمون ۱۰ بود و رقمها بین ۰ تا ۹ بودن.
  • توی باینری: پایهمون ۲ـه و رقمهامون فقط ۰ و ۱ هستن.

پس توی باینری همون کاری رو میکنیم که توی دهدهی میکردیم، به طوری کلی سیستم نمایش اعداد برای مبنای 2 رو اینطور تعریف میکنیم:

نمایش یک عدد به وسیله مجموع توان های 2

به این مثال ها دقت بفرمایید:

مثال های نمایش اعداد با استفاده از مجموع توان های 2
مثال های نمایش اعداد با استفاده از مجموع توان های 2

پس هر عددی یک ساختار درونی بر پایه دو داره، یعنی میتونیم اون عدد رو به صورت مجموع توان های 2 نمایشی بدیم.

مثلا 11 :

11 = 1×2³ + 0×2² + 1×2¹ + 1×2⁰

خوب حالا اگر متوجه شدی، سعی کن عدد 20 رو با استفاده از مجموع توان های 2 بنویسی.

دقیقا همین میشه:

20 = 1×2⁴ + 0×2³ + 1×2² + 0×2¹ + 0×2⁰

مختصر نویسی اعداد برپایه 2

حالا که فهمیدیم اعداد رو میشه به صورت مجموع توان های 2 نوشت، به همون روشی که توی دهدهی اعدا رو مختصر مینوسیم اعداد بر پایه 2 رو مختصر مینویسیم. حالا میتونیم برگردیم سراغ سوال اصلی مون که عدد 13 رو چطوری توی باینری مینویسیم 1101:

مختصر نویسی اعداد برپایه 2
مختصر نویسی اعداد برپایه 2


unityبازی سازیc
۰
۰
صالح ترکانلو
صالح ترکانلو
شاید از این پست‌ها خوشتان بیاید