محدوده ی نوع داده ها در متلب

چاپ

محدوده ی یک نوع(type)، عبارت است از کوچکترین و بزرگترین اعدادی که می توانند در این نوع، ذخیره شوند. و در متلب می توان آن را محاسبه نمود. بعنوان مثال، نوع uint8 مقدار 8^2 یا 256 عدد صحیح را در محدوده ی 0 تا 255 در خود ذخیره می کند. اما محدوده ی اعدادی که می توانند در داخل نوع int8 قرار بگیرند، از 128- تا 127+ است. برای پیدا کردن محدوده ی یک نوع، می توانید نام آن نوع را با استفاده از تک-کوتیشن ها در داخل توابع intmin و intmax قرار دهید. به مثال زیر توجه کنید:

 توابع بسیاری وجود دارند که مقادیر را از یک نوع به انواع دیگر تبدیل می کنند. نام این توابع مشابه با نام نوعی هست در داخل آن وارد می شود. با استفاده از این نام ها، می توان همچون تابع ها برای تبدیل یک مقدار از آن نوع استفاده نمود. به انجام  این کار، تبدیل یک مقدار به یک نوع متفاوت دیگر(type casting) گفته می شود. 

بعنوان مثال، برای تبدیل یک مقدار از نوع double (که پیش فرض است) به نوع int32، باید از تابع ()int32 استفاده کنیم. به مثال زیر توجه کنید:

>> val = 6 + 3;

با اجرای دستور بالا، مقدار 9 در یک متغیر به نام val ذخیره می شود، که به طور پیش فرض از نوع double است( به پنجره ی workspace توجه کنید). حالا اگر دستور زیر را وارد کنیم، باعث می شود که نوع متغیر ما به int32 تبدیل شود، اما مقدار آن هیچ تغییری نمی کند:

>> val = int32(val);

در زیر، از دو متغیر متفاوت استفاده کرده ایم، به آن توجه کنید:

 توجه کنید که در مثال بالا، از دستور whos استفاده کرده ایم. این دستور درواقع نوع(کلاس) متغیرها و همچنین تعداد بایت هایی که برای ذخیره ی مقدار آنها مورد استفاده قرار گرفته است را مشخص می کند. هر بایت معادل است با 8 بیت، بنابراین می توان گفت که نوع داده ی int32 از 4 بایت استفاده می کند. 

صرفه جویی در حافظه، یکی از علت های استفاده از نوع داده ی اعداد صحیح(integer) برای متغیرها است. 

سوال سریع!

چه می شود اگر پا را از محدوده ی یک نوع داده ی خاص فراتر بگذاریم؟ بعنوان مثال، بزرگترین عدد صحیحی که می تواند در یک متغیر از نوع int8 ذخیره شود، 127 است. حال سوال اینجاست که اگر ما از یک عدد صحیح بزرگتر از 127 در یک متغیر از نوع int8 استفاده کنیم، چه اتفاقی رخ می دهد؟

مثلا داریم: $$>>int8(200)$$

 

پاسخ: 

با انجام این کار، بیشترین مقدار محدوده ی مورد نظر در آن متغیر ذخیره می شود. مثلا در اینجا عدد 127 در متغیر ذخیره می شود. همچنین اگر از یک عدد منفی که کوچکتر از کمترین مقدار محدوده ی مورد نظر است، استفاده کنیم، کمترین مقدار محدوده، یعنی 128- در متغیر ذخیره می شود. 

آنچه گفته شد، مثالی از حساب اشباع(saturation arithmetic) بود. به مثال زیر توجه کنید:

 

 

تمرین 1.4

1. محدوده ی اعداد صحیحی که در نوع های int16 و uint16 ذخیره می شودن را مشخص کنید. برای به دست آوردن نتیجه، می توانید از توابع intmin و intmax استفاده کنید.

 

2. با استفاده از یک متغیر، یک عبارت انتساب را در متلب بنویسید. سپس نوع این متغیر را در پنجره ی workspace مشاهده کنید. حالا نوع این متغیر را تغییر دهید و سپس به آن در workspace نگاه کنید. همچنین با استفاده از دستور whos نیز نوع آن متغیر را مشاهده کنید.

 همچنین یک تابع به نام cast در متلب وجود دارد که با استفاده از آن می توان نوع یک متغیر را به یک نوع دیگر تغییر داد. این تابع همچنین یک خاصیت به نام 'like' دارد، که با استفاده از آن می توان نوع یک متغیر را شبیه به نوع یک متغیر دیگر نمود. به مثال زیر توجه کنید:

 همچنین می توان از توابع عددی، برای تبدیل یک کاراکتر به مقدار عددی معادل آن، استفاده نمود( بعنوان مثال، از تابع ()double برای تبدیل یک یک کاراکتر به یک مقدار double استفاده می شود. همچنین از تابع ()int32 برای تبدیل یک کاراکتر به یک مقدار صحیح 32 بیتی، استفاده می شود). بعنوان مثال، برای تبدیل کاراکتر 'a' به مقدار عددی معادل، می توان از دستور زیر استفاده نمود:

 دستور بالا، باعث می شود که مقدار 97 که از نوع double است، در متغیر numequiv ذخیره شود. و نشان می دهد که کاراکتر 'a' نود و هشتمین کاراکتر در لیست کاراکترهای رمزگذاری شده است(توجه کنید که شمارش از 0 شروع می شود). این اهمیتی ندارد که از کدام نوعِ داده، برای تبدیل کاراکتر 'a' استفاده می کنیم. بعنوان مثال:

 دستور بالا، باعث می شود تا مقدار 97، در متغیر numequiv ذخیره شود. تنها تفاوتی که ایجاد می شود، این است که نوع داده ی متغیر حاصل، متفاوت خواهد بود( در مثال اول double خواهد بود و در مثال بالا int32). 

تابع ()char به طور برعکس عمل می کند. این تابع، اعداد را به کاراکترهای معادل آنها، تبدیل می کند:

 به دلیل اینکه حروف الفبا به ترتیب در لیست کاراکترها قرار دارند، از مثال بالا نتیجه می گیریم که کاراکتر 'b' برابر با مقدار 98 است و کاراکتر 'c' معادل با 99 است و به همین ترتیب الی آخر. 

همچنین می توان بر روی کاراکترها، اعمال ریاضی را انجام داد. بعنوان مثال برای به دست آوردن کاراکتر بعدی، در لیست رمزگذاری کاراکترها، می توان عدد 1 را به آن کاراکتر یا عدد صحیح معادل آن، اضافه نمود. به مثال زیر توجه کنید:

 128 کاراکتر اول در متلب، معادل با 128 کاراکتر در جدول استاندارد اسکی(ASCII) هستند. نرم افزار متلب، از یک لیست رمزگذاری شده ی کاراکترها استفاده می کند که شامل 65535 کاراکتر است. کاراکترهای 128 تا 65535، به تنظیمات محلی کامپیوتر شما بستگی دارند( به زبانی که برای محیط شما تنظیم شده است بستگی دارد). بعنوان مثال، در آمریکا، از 'en_US' بعنوان زبان انگلیسی استفاده می شود. 

 همچنین می توان رشته ها را نیز به مقدارهای عددی معادل شان تبدیل نمود. بعنوان مثال اگر یک رشته را به تابع ()double بدهیم، مقدارهای معادل تمامی کاراکترهای آن رشته، نمایش داده خواهند شد:

 برای اینکه کاراکترهای یک رشته را به سمت راست در لیست کاراکترها شیفت دهیم، می توانیم یک عدد صحیح را به آن رشته اضافه کنیم. بعنوان مثال در مثال زیر، رشته ی مورد نظر به اندازه ی یک واحد، شیفت داده شده است:

 

تمرین 1.5

1. مقدار معادل عددی کاراکتر 'x' را پیدا کنید. 

2. کاراکتر معادل عدد 107 را پیدا کنید.