unsigned int

Description :

Sur les cartes Uno et les autres cartes basées sur ATMEGA, les entiers non signés (entiers non signés) sont les mêmes que les entiers dans la mesure où ils stockent une valeur de 2 octets. Au lieu de stocker des nombres négatifs, ils ne stockent cependant que des valeurs positives, ce qui donne une plage utile de 0 à 65 535 ((2^16) – 1).

Le Due stocke une valeur de 4 octets (32 bits), allant de 0 à 4 294 967 295 (2^32 – 1).

La différence entre les entiers non signés et les entiers (signés) réside dans la manière dont le bit le plus élevé, parfois appelé bit de « signe », est interprété. Dans le type Arduino int (qui est signé), si le bit de poids fort est un « 1 », le nombre est interprété comme un nombre négatif et les 15 autres bits sont interprétés avec ( complément mathématique à 2 ).

Syntaxe :

unsigned int var = val;

Paramètres :

var : Nom de variable.
val : la valeur que vous attribuez à cette variable.

Exemple de code :

unsigned int ledPin = 13;

 

Remarques et avertissements :

Lorsque des variables non signées dépassent leur capacité maximale, elles « retournent » à 0, et inversement :

unsigned int x;
x = 0;
x = x - 1;  // x contient maintenant 65535 - retourne dans le sens négatif
x = x + 1;  // x contient maintenant 0 - retourne

 

Les mathématiques avec des variables non signées peuvent produire des résultats inattendus, même si votre variable non signée n’est jamais renouvelée.

Le MCU applique les règles suivantes :

Le calcul est effectué dans le périmètre de la variable de destination. Par exemple, si la variable de destination est signée, elle fera des mathématiques signées, même si les deux variables d’entrée ne sont pas signées.

Cependant avec un calcul qui nécessite un résultat intermédiaire, la portée du résultat intermédiaire n’est pas précisée par le code. Dans ce cas, le MCU effectuera des calculs non signés pour le résultat intermédiaire, car les deux entrées ne sont pas signées !

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

result = x - y; // 5 - 10 = -5, comme prévu
result = (x - y) / 2; // 5 - 10 en mathématiques non signées est 65530 ! 65530/2 = 32765

// solution : utilisez des variables signées, ou faites le calcul étape par étape.
result = x - y; // 5 - 10 = -5, comme prévu
result = result / 2;  //  -5/2 = -2 (seulement les mathématiques entières, les décimales sont supprimées)

 

Pourquoi utiliser des variables non signées ?

  • Le comportement de retournement est souhaité, par exemple les compteurs
  • La variable signée est un peu trop petite, mais vous voulez éviter la perte de mémoire et de vitesse de long/float.

 


 

Source : https://www.arduino.cc/reference/en/language/variables/data-types/unsignedint/

 

Laisser un commentaire