الفرق بين المراجعتين لصفحة: «Arduino/unsignedint»

من موسوعة حسوب
أنشأ الصفحة ب'في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega، يماثل النوع <code>unsigned int</code>  (عدد صحيح...'
 
لا ملخص تعديل
 
سطر 1: سطر 1:
في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega، يماثل النوع <code>unsigned int</code>  (عدد صحيح عديم الإشارة) النوع int بالحجم، إذ يحجز كلاهما 2 بايت من الذاكرة لتخزين القيم فيها. الفارق الوحيد بينهما هو أنَّ الأول لا يخزن الأعداد السالبة خلافًا للثاني بل يخزَّن الأعداد الموجبة فقط التي تتراوح من 0 إلى 65,535 (تساوي 1 - 16^2).
<noinclude>{{DISPLAYTITLE:النوع <code>unsigned int</code> في  أردوينو}}</noinclude>
في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega، يماثل النوع <code>unsigned int</code> (عدد صحيح عديم الإشارة) النوع <code>[[Arduino/int|int]]</code> بالحجم، إذ يحجز كلاهما 2 بايت من الذاكرة لتخزين القيم فيها. الفارق الوحيد بينهما هو أنَّ الأول لا يخزن أعدادًا سالبةً -خلافًا للثاني- بل يخزَّن الأعداد الموجبة فقط التي تتراوح من 0 إلى 65,535 (تساوي 1 - 16^2).


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


يكمن الفرق بين النوع unsigned int (عدد صحيح عديم الإشارة) والنوع int (عدد صحيح ذو إشارة) في كيفية تفسير البت العلوي الأكثر أهمية، الذي يشار إليه غالبًا ببت الإشارة. في النوع int (الذي يملك إشارة)، إن كانت قيمة البت العلوي هي 1، يُفسَّر العدد على أنَّه عددٌ سالبٌ، والبتات 15 المتبقية تفسَّر بعملية «[http://en.wikipedia.org/wiki/2%27s_complement المتمم الثنائي]».
يكمن الفرق بين النوع <code>unsigned int</code> (عدد صحيح عديم الإشارة) والنوع [[Arduino/int|<code>int</code>]] (عدد صحيح ذو إشارة) في كيفية تفسير البت العلوي الأكثر أهمية، الذي يشار إليه غالبًا ببت الإشارة. في النوع <code>[[Arduino/int|int]]</code>، إن كانت قيمة البت العلوي هي 1، فسيُفسَّر العدد على أنَّه عددٌ سالبٌ، والبتات 15 المتبقية تفسَّر بعملية «[http://en.wikipedia.org/wiki/2%27s_complement المتمم الثنائي]».
 
==البنية العامة==
== البنية العامة ==
<syntaxhighlight lang="arduino">
<syntaxhighlight lang="arduino">
unsigned int var = val;
unsigned int var = val;
</syntaxhighlight>يمثِّل <code>var</code> اسم المتغير المراد التصريح به، وتمثِّل <code>val</code> القيمة العددية المراد إسنادها إلى هذا المتغير.
</syntaxhighlight>يمثِّل <code>var</code> اسم المتغير المراد التصريح به، وتمثِّل <code>val</code> القيمة العددية المراد إسنادها إلى هذا المتغير.
 
==أمثلة==
== أمثلة ==
مثال عن تعريف متغير من النوع <code>unsigned int</code>:<syntaxhighlight lang="arduino">
مثال عن تعريف متغير من النوع <code>unsigned int</code>:<syntaxhighlight lang="arduino">
unsigned int ledPin = 13;
unsigned int ledPin = 13;
</syntaxhighlight>
</syntaxhighlight>
 
==ملاحظات وتحذيرات==
== ملاحظات وتحذيرات ==
عندما تتجاوز المتغيرات ذات النوع <code>unsigned int</code> القيمة العددية القصوى التي يمكن تخزينها فيه، فستلتف مجدَّدًا إلى أدنى قيمة يمكن تخزينها فيها وهي 0 والعكس صحيح؛ يشار إلى المتغيرات في هذه الحالة بأنَّها وصلت إلى حالة «الطفحان» (overflow):<syntaxhighlight lang="arduino">
عندما تتجاوز المتغيرات ذات النوع <code>unsigned int</code> القيمة العددية القصوى التي يمكن تخزينها فيه، فستلتف مجدَّدًا إلى أدنى قيمة يمكن تخزينها فيه وهي 0 والعكس صحيح؛ يُطلَق على المتغيرات في هذه الحالة بأنَّها «طفحت» ووصلت إلى حالة «الصفحان» (overflow):<syntaxhighlight lang="arduino">
unsigned int x;
unsigned int x;
   x = 0;
   x = 0;
سطر 22: سطر 20:
   x = x + 1;      // إلى القيمة 0 x أمَّا الآن، ستعود قيمة المتغير
   x = x + 1;      // إلى القيمة 0 x أمَّا الآن، ستعود قيمة المتغير


</syntaxhighlight>إجراء العمليات الحسابية مع متغيرات من النوع <code>unsigned int</code> قد يعطي نتائج غير متوقعة، حتى لو لم تصل تلك المتغيرات إلى حالة الطفحان. على سبيل المثال، إن كان المتغير الهدف يملك إشارة (signed)، فستُطبَّق العمليات الحسابية الخاصة بالأعداد ذات الإشارة حتى إن كان أحد المدخلات عديم الإشارة.
</syntaxhighlight>إجراء العمليات الحسابية مع متغيرات من النوع <code>unsigned int</code> قد يعطي نتائج غير متوقعة، حتى لو لم تصل تلك المتغيرات إلى حالة الطفحان. على سبيل المثال، إن كان المتغير الهدف يملك إشارة (signed)، فستُطبَّق العمليات الحسابية الخاصة بالأعداد ذات الإشارة حتى إن كان أحد المتغيرات أو الثوابت التي ستُجرَى عليها العملية عديم الإشارة.


على أي حال، عندما تجرَى عمليات حسابية تتطلب نتيجة وسيطة، يكون نطاق ذلك الناتج الوسيط غير محدِّد من قبل الشيفرة. في هذه الحالة، سيُطبِّق المتحكم العمليات الرياضية الخاصة بالأعداد عديمة الإشارة مع الناتج الوسيط لأنَّ المدخلات عديمة الإشارة أيضًا. الشيفرة التالية تشرح ذلك بالتفصيل:<syntaxhighlight lang="arduino">
على أي حال، عندما تجرَى عمليات حسابية على عدة مراحل (انظر المثال في الأسفل)، يكون نطاق العدد الناتج عن كل مرحلة والمراد تخزينه مؤقتًا في متغير غير محدِّد من قبل الشيفرة. في هذه الحالة، سيُطبِّق المتحكم العمليات الرياضية الخاصة بالأعداد عديمة الإشارة إن كانت المتغيرات أو الثوابت التي ستطبَّق عليها العملية عديمة الإشارة أيضًا. الشيفرة التالية تشرح ذلك بالتفصيل:<syntaxhighlight lang="arduino">
unsigned int x=5;
unsigned int x=5;
unsigned int y=10;
unsigned int y=10;
سطر 37: سطر 35:


</syntaxhighlight>لماذا تُستعمَل المتغيرات عديمة الإشارة؟
</syntaxhighlight>لماذا تُستعمَل المتغيرات عديمة الإشارة؟
* قد يكون وصول المتغير إلى حالة الطفحان مرغوبًا مثل استعمالها مع العدادات.
*قد يكون وصول المتغير إلى حالة الطفحان أمرًا مرغوبًا فيه مثل حالة العدادات التي تصفَّر بعد وصولها لقيمة معيَّنة.
* القيمة العددية الموجبة للمتغيرات ذات الإشارة صغيرة جدًا ولكنك تريد أن تتجنب أيضًا حجز حجم كبير من الذاكرة وانخفاض الأداء التي تحدث عند استعمال النوع long أو float.
*القيمة العددية الموجبة للمتغيرات ذات الإشارة صغيرة جدًا وكنت تريد أن تتجنب أيضًا حجز حجم كبير من الذاكرة وحصول انخفاضٍ في الأداء الناتج عن استعمال النوع <code>[[Arduino/long|long]]</code> أو <code>[[Arduino/float|float]]</code>.
 
==انظر أيضًا==
== انظر أيضًا ==
* النوع <code>[[Arduino/array|array]]</code>: يمثِّل مصفوفة من المتغيرات الموضوعة في وعاء واحد والتي يمكن الوصول إليها والتعامل معها عبر رقم فهرس كلٍّ منها.
* النوع <code>[[Arduino/bool|bool]]</code>: يخزِّن المتغير الذي يصرَّح عنه بأنَّه من النوع [[Arduino/bool|<code>bool</code>]] إحدى القيمتين المنطقيَّتين التاليتين: <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA true|true]]</code>، أو <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA false|false]]</code> عبر حجز بايتٍ واحدٍ من الذاكرة فقط.
* النوع <code>[[Arduino/byte|byte]]</code>: يُخزِّن عددًا عديم الإشارة بحجم 8 بت؛ أي من القيمة 0 إلى القيمة 255.
* النوع <code>[[Arduino/char|char]]</code>: يحجز بايتًا واحدًا من الذاكرة ويخزِّن فيه قيمة محرف.
* النوع <code>[[Arduino/double|double]]</code>: يحجز أربعة بايتات (32 بت) من الذاكرة فقط في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو ثمانية بايتات (64 بت) في اللوحات Due لتخزين عدد عشري فيها.
* النوع <code>[[Arduino/float|float]]</code>: يحجز أربعة بايتات (32 بت) من الذاكرة لتخزين عدد عشري فيها.
* النوع <code>[[Arduino/int|int]]</code>: يحجز حجمًا مقداره 16 بت (2 بايت) من الذاكرة في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega)  أو 32 بت (4 بايت) في لوحات أردوينو Due (والتي تعتمد على متحكمات SAMD) لتخزين عدد صحيح فيه.
* النوع <code>[[Arduino/long|long]]</code>: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يستعمل لتخزين الأعداد الصحيحة التي تتسم بأنَّها طويلة.
* النوع <code>[[Arduino/short|short]]</code>: يحجز في جميع لوحات أردوينو (التي تعتمد على المتحكمات ATMega و ARM) حجمًا من الذاكرة مقداره 16 بت (2 بايت) لتخزين عدد قصير فيه.
* النوع <code>[[Arduino/string|string]]</code>: يمثِّل سلسلةً نصيةً مؤلفةً من عدة محارف مرتبطة مع بعضها بعضًا. تُستعمَل مصفوفة من المحارف لتخزين هذا النوع من البيانات واستدعائها والتعامل معها لاحقًا.
* النوع <code>[[Arduino/unsignedchar|unsigned char]]</code>: يحجز حجمًا من الذاكرة مقداره 1 بايت فقط.
* النوع <code>[[Arduino/unsignedlong|unsigned long]]</code>: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد الصحيحة عديمة الإشارة التي تتسم بأنَّها طويلة.
* النوع <code>[[Arduino/word|word]]</code>: يُخزِّن أعدادًا عديم الإشارة بحجم 2 بايت.


== مصادر ==
==مصادر==
* [https://www.arduino.cc/reference/en/language/variables/data-types/unsignedint/ صفحة النوع unsigned int  في توثيق أردوينو الرسمي.]
*[https://www.arduino.cc/reference/en/language/variables/data-types/unsignedint/ صفحة النوع unsigned int  في توثيق أردوينو الرسمي.]
[[تصنيف: Arduino]]
[[تصنيف: Arduino Data Type]]

المراجعة الحالية بتاريخ 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 بايت.

مصادر