Printf et type de variables
Résolu/Fermé
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
- Changer type de fichier - Guide
- Chat type coco - Accueil - Réseaux sociaux
- Faiblesse type psy ✓ - Forum Jeux vidéo
2 réponses
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
7 nov. 2012 à 06:46
7 nov. 2012 à 06:46
"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
armasousou
Messages postés
1268
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
83
7 nov. 2012 à 19:12
7 nov. 2012 à 19:12
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.
armasousou
Messages postés
1268
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
83
7 nov. 2012 à 19:25
7 nov. 2012 à 19:25
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.
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
7 nov. 2012 à 19:30
7 nov. 2012 à 19:30
"les gens au dessus disent des betises, en aucun cas un unsigned int est codé sur 32 bit ou autre"
Vu les valeurs numériques qu'a obtenu Jork, c'est bien du 32 bits qui est exécuté.
Vu les valeurs numériques qu'a obtenu Jork, c'est bien du 32 bits qui est exécuté.
armasousou
Messages postés
1268
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
83
7 nov. 2012 à 19:42
7 nov. 2012 à 19:42
Ce n'est tout de même pas à généraliser.
7 nov. 2012 à 07:19
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é.
7 nov. 2012 à 07:56
-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.
7 nov. 2012 à 18:58
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 ?
7 nov. 2012 à 19:08
7 nov. 2012 à 19:15