|

unsigned int


Description :

Sur les cartes UNO et autres cartes ATMEGA, les entiers non signés (ints) sont identiques aux ints : ils stockent une valeur sur 2 octets. Cependant, au lieu de stocker des nombres négatifs, ils ne stockent que des valeurs positives, ce qui donne une plage utile de 0 à 65 535 ((2^16) – 1).

Le Due stocke une valeur sur 4 octets (32 bits), comprise entre 0 et 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 façon dont le bit de poids fort, parfois appelé bit de « signe », est interprété. Dans le type int Arduino (qui est signé), si le bit de poids fort est « 1 », le nombre est interprété comme un nombre négatif, et les 15 bits restants sont interprétés en complément à 2.

Syntaxe :

unsigned int var = val;

Paramètres :

  • var : nom de la variable
  • val : la valeur à attribuer à cette variable

Exemple de code :

unsigned int ledPin = 13;

Remarques et avertissements :

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

unsigned int x;
    x = 0;
    x = x - 1;  // x contient maintenant 65535 - roule dans la direction négative
    x = x + 1;  // x contient maintenant 0 - se retourne

Les calculs avec des variables non signées peuvent produire des résultats inattendus, même si votre variable non signée ne se retourne jamais.

Le MCU applique les règles suivantes :

Le calcul est effectué dans la portée de la variable de destination. Par exemple, si la variable de destination est signée, le calcul sera effectué avec signature, même si les deux variables d’entrée sont non signées.

Cependant, pour un calcul nécessitant un résultat intermédiaire, la portée de ce résultat n’est pas spécifiée par le code. Dans ce cas, le MCU effectuera un calcul avec signature pour le résultat intermédiaire, car les deux entrées sont non 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 : utiliser des variables signées, ou faire le calcul étape par étape.
    result = x - y; // 5 - 10 = -5, comme prévu
    result = result / 2;  //  -5/2 = -2 (uniquement des calculs entiers, les décimales sont supprimées)

Pourquoi utiliser des variables non signées ?

  • Le comportement de roulement est souhaité, par exemple pour les compteurs.
  • La variable signée est un peu trop petite, mais vous souhaitez éviter la perte de mémoire et de vitesse due aux valeurs longues/float.


Source : https://docs.arduino.cc/language-reference/en/variables/data-types/unsignedInt/

Publications similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *