النوع unsigned int في أردوينو

من موسوعة حسوب
< Arduino
مراجعة 14:53، 26 أكتوبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega، يماثل النوع unsigned int (عدد صحيح عديم الإشارة) النوع int بالحجم، إذ يحجز كلاهما 2 بايت من الذاكرة لتخزين القيم فيها. الفارق الوحيد بينهما هو أنَّ الأول لا يخزن أعدادًا سالبةً -خلافًا للثاني- بل يخزَّن الأعداد الموجبة فقط التي تتراوح من 0 إلى 65,535 (تساوي 1 - 16^2).

أمَّا في لوحات أردوينو Due، فيحجز النوع unsigned int حجمًا من الذاكرة مقداره 4 بايت (32 بت)، والقيم التي يمكن تخزينها فيه تقع في المجال 0 إلى 4,294,967,295 (تساوي 1 - 32^2).

يكمن الفرق بين النوع unsigned int (عدد صحيح عديم الإشارة) والنوع int (عدد صحيح ذو إشارة) في كيفية تفسير البت العلوي الأكثر أهمية، الذي يشار إليه غالبًا ببت الإشارة. في النوع int، إن كانت قيمة البت العلوي هي 1، فسيُفسَّر العدد على أنَّه عددٌ سالبٌ، والبتات 15 المتبقية تفسَّر بعملية «المتمم الثنائي».

البنية العامة

unsigned int var = val;

يمثِّل var اسم المتغير المراد التصريح به، وتمثِّل val القيمة العددية المراد إسنادها إلى هذا المتغير.

أمثلة

مثال عن تعريف متغير من النوع unsigned int:

unsigned int ledPin = 13;

ملاحظات وتحذيرات

عندما تتجاوز المتغيرات ذات النوع unsigned int القيمة العددية القصوى التي يمكن تخزينها فيه، فستلتف مجدَّدًا إلى أدنى قيمة يمكن تخزينها فيها وهي 0 والعكس صحيح؛ يشار إلى المتغيرات في هذه الحالة بأنَّها وصلت إلى حالة «الطفحان» (overflow):

unsigned int x;
   x = 0;
   x = x - 1;       // الآن هي 65535 x ستصبح قيمة المتغير
   x = x + 1;       // إلى القيمة 0 x أمَّا الآن، ستعود قيمة المتغير

إجراء العمليات الحسابية مع متغيرات من النوع unsigned int قد يعطي نتائج غير متوقعة، حتى لو لم تصل تلك المتغيرات إلى حالة الطفحان. على سبيل المثال، إن كان المتغير الهدف يملك إشارة (signed)، فستُطبَّق العمليات الحسابية الخاصة بالأعداد ذات الإشارة حتى إن كان أحد المتغيرات أو الثوابت التي ستُجرَى عليها العملية عديم الإشارة. على أي حال، عندما تجرَى عمليات حسابية على عدة مراحل (انظر المثال في الأسفل)، يكون نطاق العدد الناتج عن كل مرحلة والمراد تخزينه مؤقتًا في متغير غير محدِّد من قبل الشيفرة. في هذه الحالة، سيُطبِّق المتحكم العمليات الرياضية الخاصة بالأعداد عديمة الإشارة إن كانت المتغيرات أو الثوابت التي ستطبَّق عليها العملية عديمة الإشارة أيضًا. الشيفرة التالية تشرح ذلك بالتفصيل:

unsigned int x=5;
unsigned int y=10;
int result;

   result = x - y; // 5 - 10 = -5 كما هو متوقع
   result = (x - y)/2; // ناتج 10 - 5 في الرياضيات عديمة الإشارة هو 65530، ويكون 65530/2 = 32765   

   // لحل تلك المشكلة، استعمل متغيرات ذات إشارة أو نفِّذ العملية الحسابية على عدة خطوات
   result = x - y; // الناتج  5- =  10 - 5 كما هو متوقع
   result = result / 2; //  -5/2 = -2 (ستهمل الأعداد بعد الفاصلة لأن نوع العدد صحيح)

لماذا تُستعمَل المتغيرات عديمة الإشارة؟

  • قد يكون وصول المتغير إلى حالة الطفحان أمرًا مرغوبًا فيه مثل حالة العدادات التي تصفَّر بعد وصولها لقيمة معيَّنة.
  • القيمة العددية الموجبة للمتغيرات ذات الإشارة صغيرة جدًا وكنت تريد أن تتجنب أيضًا حجز حجم كبير من الذاكرة وحصول انخفاضٍ في الأداء الناتج عن استعمال النوع long أو float.

انظر أيضًا

  • النوع array: يمثِّل مصفوفة من المتغيرات الموضوعة في وعاء واحد والتي يمكن الوصول إليها والتعامل معها عبر رقم فهرس كلٍّ منها.
  • النوع bool: يخزِّن المتغير الذي يصرَّح عنه بأنَّه من النوع bool إحدى القيمتين المنطقيَّتين التاليتين: true، أو false عبر حجز بايتٍ واحدٍ من الذاكرة فقط.
  • النوع byte: يُخزِّن عددًا عديم الإشارة بحجم 8 بت؛ أي من القيمة 0 إلى القيمة 255.
  • النوع char: يحجز بايتًا واحدًا من الذاكرة ويخزِّن فيه قيمة محرف.
  • النوع double: يحجز أربعة بايتات (32 بت) من الذاكرة فقط في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو ثمانية بايتات (64 بت) في اللوحات Due لتخزين عدد عشري فيها.
  • النوع float: يحجز أربعة بايتات (32 بت) من الذاكرة لتخزين عدد عشري فيها.
  • النوع int: يحجز حجمًا مقداره 16 بت (2 بايت) من الذاكرة في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو 32 بت (4 بايت) في لوحات أردوينو Due (والتي تعتمد على متحكمات SAMD) لتخزين عدد صحيح فيه.
  • النوع long: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يستعمل لتخزين الأعداد الصحيحة التي تتسم بأنَّها طويلة.
  • النوع short: يحجز في جميع لوحات أردوينو (التي تعتمد على المتحكمات ATMega و ARM) حجمًا من الذاكرة مقداره 16 بت (2 بايت) لتخزين عدد قصير فيه.
  • النوع string: يمثِّل سلسلةً نصيةً مؤلفةً من عدة محارف مرتبطة مع بعضها بعضًا. تُستعمَل مصفوفة من المحارف لتخزين هذا النوع من البيانات واستدعائها والتعامل معها لاحقًا.
  • النوع unsigned char: يحجز حجمًا من الذاكرة مقداره 1 بايت فقط.
  • النوع unsigned long: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد الصحيحة عديمة الإشارة التي تتسم بأنَّها طويلة.
  • النوع word: يُخزِّن أعدادًا عديم الإشارة بحجم 2 بايت.

مصادر