
در آردوینو، نوع دادهی unsigned long یک نوع عدد صحیح است که فقط اعداد مثبت یا صفر را ذخیره میکند و در تمام بردهای رایج آردوینو (از جمله Uno، Nano، ESP32 و Due) دقیقاً ۴ بایت (۳۲ بیت) حافظه مصرف میکند.
محدودهی مقادیر قابل ذخیره در یک متغیر unsigned long:
۰ تا ۴,۲۹۴,۹۶۷,۲۹۵
این محدوده تقریباً دو برابر بزرگتر از محدودهی long (که شامل اعداد منفی هم میشود) است و برای کارهایی که نیاز به اعداد بسیار بزرگ و فقط مثبت دارند، گزینهی ایدهآلی است.
توضیح برای مبتدیها: فکر کنید یک شمارنده دارید که میخواهد ثانیههای گذشته از سال ۲۰۰۰ را بشمارد. این عدد خیلی بزرگ میشود — بیشتر از ۲ میلیارد! اگر از
longاستفاده کنید، نصف فضای عددی شما برای اعداد منفی هدر میرود. اما باunsigned long، همهی فضای ۴ بایتی فقط برای اعداد مثبت استفاده میشود — پس شمارندهتان تا ۴ میلیارد ثانیه (بیش از ۱۳۶ سال!) کار میکند.
در بسیاری از پروژهها، اعدادی که استفاده میکنیم همیشه مثبت هستند و از محدودهی unsigned int (در Uno: ۰–۶۵,۵۳۵) فراتر میروند. مثالهای رایج:
millis() بعد از ۴۹ روز سرریز میشود — اما تا آن زمان، مقدار آن در محدودهی unsigned long است.unsigned long currentTime = millis(); // زمان فعلی سیستم
unsigned long totalEvents = 1000000UL; // شمارندهی بزرگ
unsigned long deviceId = 3487294823UL; // شناسه دستگاه
توجه: برای تعریف یک عدد ثابت به عنوان unsigned long، بهتر است پسوند UL یا ul به آن اضافه کنید (ترجیحاً UL بزرگ):
unsigned long bigNumber = 4000000000UL; // مشخص میکند که این عدد unsigned long است
تابع millis() خروجی unsigned long دارد. برای محاسبهی دقیق زمان سپریشده، باید از همان نوع استفاده کنیم:
unsigned long startTime = millis();
void setup() {
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
unsigned long elapsedTime = currentTime - startTime; // همیشه مثبت است
Serial.print("زمان سپریشده: ");
Serial.print(elapsedTime / 1000); // تبدیل به ثانیه
Serial.println(" ثانیه");
delay(1000);
}
توضیح برای مبتدیها: چرا
elapsedTimeهمیشه مثبت است؟ چون هر دوcurrentTimeوstartTimeاز نوعunsigned longهستند وcurrentTimeهمیشه بزرگتر یا مساویstartTimeاست. حتی اگرmillis()سرریز کند (بعد از ۴۹ روز)، تفریق بهدرستی کار میکند — چون حساب پیمانهای (modulo) انجام میشود.
| نوع داده | اندازه | محدوده (در تمام بردها) |
|---|---|---|
| unsigned int | 2 بایت (در Uno) | 0 تا 65,535 |
| long | 4 بایت | −2,147,483,648 تا +2,147,483,647 |
| unsigned long | 4 بایت | 0 تا 4,294,967,295 |
توابع millis() و micros() همیشه unsigned long برمیگردانند. اگر خروجی آنها را در یک int یا حتی long ذخیره کنید، ممکن است: — در Uno، پس از ۳۲ ثانیه سرریز شود (اگر از int استفاده کنید)
— در محاسبات، عدد منفی تولید شود (اگر از long استفاده کنید و مقدار از ۲ میلیارد بیشتر شود)
بنابراین، همیشه از unsigned long برای ذخیرهی زمان استفاده کنید.
در حالی که unsigned int در بردهای مختلف اندازهی متفاوتی دارد، unsigned long در تمام پلتفرمهای آردوینو همیشه ۴ بایت است.
این ویژگی باعث میشود کدهای شما قابل انتقالتر (portable) باشند. اگر به اطمینان نیاز دارید که متغیر شما ۴ بایت است و فقط مثبت باشد، unsigned long گزینهی ایمنتری نسبت به unsigned int است.
unsigned long = ۴ بایت، فقط ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵millis() و micros() استفاده شوداین مطلب بر اساس مستندات رسمی Arduino از بخش unsigned long – Language Reference تهیه شده است، با توضیحات سادهشده، مثالهای کاربردی و نکات طلایی منحصربهفرد برای جامعه فارسیزبان.
برچسب های مهم