Printf et type de variables
Résolu
Jork
-
Jork -
Jork -
A voir également:
- Pour être traitée par un ordinateur, l'information est codée avec un codage binaire (0 ou 1). elle occupe une certaine quantité d'espace mémoire mesurée en nombre de bits. voici deux façons de coder des lettres avec un codage binaire. le code 1 utilise 8 bits par lettre. le code 2 utilise moins de bits.
- Clear type - Guide
- Type de ram - Guide
- Comment changer le type de fichier - Guide
- Chat type coco - Accueil - Réseaux sociaux
- Printf hexa - Forum Programmation
2 réponses
"alors qu'une fois en dehors la fonction va me chercher 3 autres octets remplis de 1 si je comprend bien."
De quoi tu parles ?
Le char est représenté sur 8 bits, ce qui signifie en particulier que de 128 à 255, le premier bit est à 1, ce qui correspond dans la plupart des représentations des nombres à une valeur négative.
255 correspond donc à -1, et comme on force l'affichage à un unsigned int (%u) on rajoute 2^32 au résultat, soit -1+2^32=4 294 967 295
Pareil pour 128 qui donne -128+2^32=4 294 967 168
De quoi tu parles ?
Le char est représenté sur 8 bits, ce qui signifie en particulier que de 128 à 255, le premier bit est à 1, ce qui correspond dans la plupart des représentations des nombres à une valeur négative.
255 correspond donc à -1, et comme on force l'affichage à un unsigned int (%u) on rajoute 2^32 au résultat, soit -1+2^32=4 294 967 295
Pareil pour 128 qui donne -128+2^32=4 294 967 168
char sert a definir des CARACTERES, même si on peut l'utiliser pour des nombres et autres subtilités (biblio string.h par exemple).
Utilise int pour les entiers, et double pour les réels.
Utilise int pour les entiers, et double pour les réels.
Pour être précis, char permet de faire "correspondre" le nombre qui lui est inclut (par exemple 65) en caractere correspondant à ce nombre dans la table asci (ici, A).
Si tu fais char secret='A';
La variable secret prend la valeur 65, le printf("%c", secret); affiche donc le caractere (%c) correspondant.
Tu peux bien faire int x=65;
printf("%c", x);
ca affichera aussi "A" :)
Ceux ne sont que des types de données, derrieres ya des paquet d'octets, ce qui compte c'est comment on les interprete ^^
Ici %c l'interprete comme un caractere (donc il va cherche dans la table asci), un %i (ou %d) vera la variable comme un entier, un %s pour une chaine de caractere (phrase).
Par ailleurs, les gens au dessus disent des betises, en aucun cas un unsigned int est codé sur 32 bit ou autre. Le char est codé sur 8 bits, ca c'est sur, le reste depend de la machine.
Si tu fais char secret='A';
La variable secret prend la valeur 65, le printf("%c", secret); affiche donc le caractere (%c) correspondant.
Tu peux bien faire int x=65;
printf("%c", x);
ca affichera aussi "A" :)
Ceux ne sont que des types de données, derrieres ya des paquet d'octets, ce qui compte c'est comment on les interprete ^^
Ici %c l'interprete comme un caractere (donc il va cherche dans la table asci), un %i (ou %d) vera la variable comme un entier, un %s pour une chaine de caractere (phrase).
Par ailleurs, les gens au dessus disent des betises, en aucun cas un unsigned int est codé sur 32 bit ou autre. Le char est codé sur 8 bits, ca c'est sur, le reste depend de la machine.
J'entendais pas légale les valeur de -128 -> 127 pour un type signed char, mais effectivement ton explication semble tout a fait logique, je ne voyais pas ça dans ce sens la.
De même 127 + 2^32 nous donne bien 127 ce qui explique le résultat que j'ai obtenu, mais je ne saisi toujours pas pourquoi on ajoute ce 2^32.
Je m'attendais à ce que la fonction prenne mes 8bit et m'affiche ça tel quel sans se préoccupé du premier bit étant donné que je lui demande de m'afficher ça comme un nombre non signé.
-1 c'est la valeur que l'on obtiendrait si on interprétait la représentation binaire avec un signed int, mais avec la même représentation en binaire, cette valeur vaut 4 294 967 295 pour un unsigned int.
Inversement 4 294 967 295 n'a aucun sens pour un signed int, puisque la valeur maximale est 2 147 483 647. Il s'agit "simplement" d'une histoire d'interprétation des bits.
quand je déclare mon char j'ai un espace de 8bits réservé, ensuite quand je demande à printf de m'afficher une variable qui est censée être codée sur 32bits mais que je lui en passe une de 8bits seulement, le problème est résolu en ajoutant la valeur de mon char à une variable de 32bits initialisé à 0 ?
Ensuite si tout ceci est correct, c'est bien le compilateur qui se charge de tout ça, qui va vérifier que mon char est signed ou non ? (puisque si j'ai bien compris en C les types ne servent qu'au compilateur, on a plus aucune trace de cette notion lors de l'exécution ?)
Et toujours dans l'hypothèse ou c'est juste, on pourrait donc imaginer qu'un autre compilateur prenne mes 8bits tel quel et remplisse les 24bits manquant avec des 0 ?