unsigned int

[Adattípusok]

Leírás

Az egész számok az elsődleges adattípusok a számtároláshoz.

Az Uno és más ATMEGA alapú kártyákon az előjel nélküli int-ek (előjel nélküli egész számok) megegyeznek az int-ekkel, mivel 2 bájtos értéket tárolnak. Negatív számok tárolása helyett azonban csak pozitív értékeket tárolnak, így 0 és 65 535 közötti hasznos tartományt adnak ((2^16) - 1).

A Due 4 bájtos (32 bites) értéket tárol, 0 és 4 294 967 295 (2^32 - 1) között.

Az előjel nélküli int és (előjeles) int közötti különbség abban rejlik, ahogyan a legmagasabb bitet értelmezik, amelyet néha "előjel" bitnek is neveznek. Az Arduino int típusban (amely előjeles), ha a magas bit "1", akkor a szám negatív számként, a többi 15 bit pedig (2-es komplementer matematikával) értelmeződik.

Szintaxis

unsigned int var = val;

Paraméterek

var: változónév.
val: az adott változóhoz rendelt érték.

Példa

unsigned int ledPin = 13;

Megjegyzések és figyelmeztetések

Amikor az előjel nélküli változók meghaladják a maximális kapacitásukat, akkor "visszagurulnak" 0-ra, és fordítva is:

unsigned int x;
x = 0;
x = x - 1;  // x most 65535-öt tartalmaz - visszafordul
x = x + 1;  // x most 0-t tartalmaz - átfordul

Az előjel nélküli változókat tartalmazó matematika nem várt eredményeket hozhat, még akkor is, ha az előjel nélküli változó soha nem fordul át.

Az MCU a következő szabályokat alkalmazza:

A számítás a célváltozó hatókörében történik. Például, ha a célváltozó előjeles, akkor is előjeles matematikát végez, ha mindkét bemeneti változó előjel nélküli.

Egy közbenső eredményt igénylő számításnál azonban a köztes eredmény terjedelmét a kód nem határozza meg. Ebben az esetben az MCU előjel nélküli számításokat végez a köztes eredményre, mert mindkét bemenet előjel nélküli!

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

result = x - y; // 5 - 10 = -5, mint várható
result = (x - y) / 2; // 5 - 10 előjel nélküli matematikában ez 65530!  65530/2 = 32765

// megoldás: használjunk előjeles változókat, vagy számoljunk lépésről lépésre.
result = x - y; // 5 - 10 = -5, mint várható
result = result / 2;  //  -5/2 = -2 (csak egész szám, a tizedesjegyek kiesnek)

Miért kell egyáltalán előjel nélküli változókat használni?

  • Az átfordulási viselkedés kívánatos, pl. számlálók

  • Az előjeles változó egy kicsit túl kicsi, de szeretné elkerülni a long/float memória- és sebességveszteségét.

Lásd még