3
votes

pourquoi la sortie du programme c suivant est -10

#include <stdio.h>

int main() {
    unsigned int a = -10;
    printf("a=%d\n", a);

    return 0;
}
The above code is printing -10 for signed int. If the both signed and unsigned are printing the -10 then what is difference between them?

3 commentaires

% d traite votre entier comme signé, utilisez plutôt % u .


Le comportement de ce programme est indéfini . Il peut imprimer -10 ou faire exploser votre ordinateur.


Vous stockez un certain modèle de bits dans a (qui est un très grand nombre s'il est interprété comme un entier non signé). Mais alors vous dites à printf d'afficher la valeur comme si elle était signée (c'est ce que fait% d). Puisque le modèle de bits est -10 lorsqu'il est interprété comme un nombre signé, c'est ce que printf affiche. Vous avez besoin d'une chaîne de format différent pour non signé - essayez printf ("a =% u \ n", a);


3 Réponses :


6
votes

printf ne connaît pas le type de l'argument que vous lui donnez. Avec % d vous lui dites que c'est un signé int , ce qui est faux. C'est un comportement indéfini - tout peut arriver. Ce qui va probablement se passer, c'est qu'il s'agit d'interpréter simplement cette mémoire comme signée int de toute façon, et avec le unsigned int a = -10; vous définissez le unsigned int sur ce qui sera interprété comme -10 lorsqu'il est lu comme signé int . Pour plus d'informations sur ce qui se passe avec l'attribution d'un nombre négatif à un type non signé, consultez cette réponse .


0 commentaires

6
votes

Vous avez en fait un comportement non défini dans ce code. < / p>

Le format "% d" est pour le format simple signé int , et un spécificateur et un argument de format incompatibles conduisent à UB.

Puisque printf n'a aucune idée des types réels passés, il ne doit se fier qu'aux spécificateurs de format. Donc, ce qui se passe probablement, c'est que la fonction printf traite simplement la valeur comme un int signé en clair et l'imprime comme tel.


0 commentaires

-1
votes

Vous devriez utiliser

printf ("a = % u \ n", a);

pour imprimer "a" comme un entier non signé


1 commentaires

Bien que cela soit correct, cela ne répond pas à la question.