#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 Réponses :
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 . P >
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.
Vous devriez utiliser
printf ("a = % u \ n", a);
pour imprimer "a" comme un entier non signé
Bien que cela soit correct, cela ne répond pas à la question.
% 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é - essayezprintf ("a =% u \ n", a);