entiers non signés en C

Pendant que j’exécute le programme ci-dessous, il génère 109876543210-1-2-3-4-5-6-78-9-10-11-12-s0. Pourquoi Quel est le concept de nombre entier non signé?

main () { unsigned int i; for (i = 10; i >= 0; i--) printf ("%d", i); } 

    Les entiers non signés sont toujours non négatifs, ce qui est supérieur ou égal à 0. Lorsque vous soustrayez 1 de 0 dans un type entier non signé, vous obtenez MAX_INT.

    Par conséquent, votre boucle for ne se terminera jamais.

    Toutefois, vous devez utiliser “% u” et non “% d” dans votre printf si vous souhaitez que la valeur non signée soit imprimée plutôt que la valeur signée.

    La chaîne de format %d traite la valeur substituée comme int , qui est signée.

    Pourquoi

    Parce que votre programme a un comportement indéfini (en utilisant %d qui permet à int d’imprimer un unsigned ), vous pouvez donc vous attendre à ce que quelque chose se passe.

    Pourquoi la boucle infinie? Parce qu’un unsigned int est toujours >= 0 .

    Quel est le concept de nombre entier non signé?

    C’est un … entier non signé . Un nombre entier non négatif.

    Vous utilisez %d , ainsi printf interprète la valeur comme signée. La comparaison à zéro (> = 0) de non signé est toujours vraie.

    Ainsi, alors que les valeurs vont de 10 à 0, la sortie est ok (109876543210). Après cela, la valeur devient extrêmement positive (valeur maximale, pour 32bit int, c’est 0xFFFFFFFF ). La comparaison à 0 est vraie, la boucle continue. Mais dans printf 0xFFFFFFFF produit -1 puisque %d est utilisé. Ensuite, la boucle continue à 0xFFFFFFFE qui est -2 mais toujours >= 0 comme non signé.

    Utilisez %u .

    printf ne peut pas connaître le type de la variable que vous lui donnez, elle n’obtient que la valeur (les bits eux-mêmes). Vous devez lui dire comment interpréter cette valeur et avec %d vous lui dites de l’interpréter comme un entier signé.

    Vous utilisez “% d” avec printf (), qui est le spécificateur de format pour un entier signé.

    La déclaration unsigned integer indique au compilateur d’utiliser des opérations non signées sur la variable. Par exemple, l’opérateur >> a un comportement différent sur les entiers non signés et signés (en particulier, s’il doit conserver le bit de signe).

    Pour imprimer un entier non signé, vous devez utiliser la mise en forme %u .

    Les entiers signés (nous utiliserons 16 bits) vont de -32768 à 32767 (0x8000 à 0x7FFF) tandis que les entiers non signés vont de 0 à 65535 (0x0000 à 0xFFFF). Les entiers non signés ne peuvent donc pas avoir de valeurs négatives, ce qui explique pourquoi votre boucle ne se termine jamais. Cependant, vous avez demandé au programme d’impression de formater la sortie comme si elle était signée ( %d ) afin que les nombres soient mis en forme en tant que valeurs négatives dans votre sortie. À un certain niveau, tout ce qui se trouve dans un ordinateur n’est qu’une chaîne de bits qui nécessite une interprétation et votre exemple de code utilise deux interprétations différentes des mêmes modèles de bits: votre entier non signé.

    Vous devez utiliser %u tant que spécificateur de format dans printf, sinon la valeur est convertie en int .