Arduino/unsignedint

من موسوعة حسوب
مراجعة 09:22، 26 أكتوبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (أنشأ الصفحة ب'في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega، يماثل النوع <code>unsigned int</code>  (عدد صحيح...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

في لوحات أردونيو 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.

انظر أيضًا

مصادر