Format specifies type 'unsigned char' but ... has type int
Résolu/Ferméleoliom Messages postés 171 Date d'inscription jeudi 21 juillet 2016 Statut Membre Dernière intervention 20 février 2024 - 6 janv. 2023 à 20:22
- Format specifies type 'unsigned char' but ... has type int
- Format epub - Guide
- Telecharger format factory - Télécharger - Conversion & Codecs
- Clear type - Guide
- Format apfs - Guide
- Format bin - Guide
10 réponses
Pourquoi ne pas essayer: "0x%02x\n" ?
Le 0 dit que tu remplis avec des 0, le 2 dit que ton champs doit avoir au moins 2 caractères.
Modifié le 6 janv. 2023 à 15:25
Le problème, c'est que ça m'affiche:
0x05
0x3e8
... or mon but est d'avoir :
0x05
0xe8
Je ne veux que les 2 premiers octets
Et d'ailleurs je sais pas pourquoi %02x ne m'affiche pas que les 2 premiers octets c'est comme si le fait que j'ai spécifié 2 ne servait à rien
J'ai bien dit "au moins" deux caractères.
Si tu ne veux que le dernier octet, tu peux afficher a % 256 ou a & 0xff
Modifié le 6 janv. 2023 à 15:27
Si j'écris ceci ça m'affiche bien le résultat que je veux :
#include <stdio.h> int main() { int a = 5; int b = 1000; // 0x3e8 printf( "0x%02x\n", a % 256); printf( "0x%02x\n", b % 256); return 0; }
Vous vouliez dire si je veux exclure le dernier octet, je dois écrire % 256 ,car si vous ne vous êtes pas trompé dans vos mots, cela ne m'affiche pas spécifiquement le dernier octet (3)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJe pense que tu te méprends sur le terme "octet",
Le nombre décimal 24 s'écrit en binaire 0001 1000
Ça entre dans un octet mais c'est représenté par 2 caractères en hexadécimal: 0x18
- Si je veux afficher le 4, j'affiche a % 10, si je veux afficher le 2, je fais a / 10 % 10 en format %d
- Si je veux afficher le 8, je fais a % 16. Si je veux afficher le 1, je fais a / 16 % 16 en format %x
Modifié le 6 janv. 2023 à 15:30
Ok, je vois c'est une autre façon de faire sans utiliser %x. Oui, j'ai confondu octet avec les 4 bit d'un nombre
Par exemple si j'ai :
#include <stdio.h> int main() { int a = 12345678; // 0xbc614e printf("%x\n", a / 16 % 16); return 0; }
Pourquoi ça n'affiche pas le le bit de poids fort a savoir b?
a%16%16 ne marche que pour des nombres à 2 chiffres
Et aussi est-ce une bonne pratique de convertir un type comme par exemple char en un type plus grand à savoir par exemple float,int etc. ?
Aussi, est-ce une bonne pratique de convertir un type grand par exemple long en un type plus petit a savoir par exemple char ?
Car je voudrais savoir si c'est exact de faire ceci:
int main(){ long a = 12345678; printf("%hhx\n", (char) a); char b = 123; printf("%hx\n", (short) b); return 0; }
Tu essaies beaucoup de choses. C'est OK pour expérimenter. Mais que veux-tu faire exactement?
- Quand tu castes un grand nombre dans un petit, tu perds les chiffres les plus significatifs.
- Si tu fais le contraire, ce n'est pas grave, mais tu perds en mémoire.
Il faut faire la différence entre la valeur interne d'un nombre et son affichage (ou sa représentation en caractères).
Modifié le 6 janv. 2023 à 15:51
En fait, je veux juste éviter que les warnings s'affichent, car en faisant ceci, il n'y a plus de warning :
#include <stdio.h> int main() { int a = 5 ; int b = 1000 ; // 0x3e8 printf("0x%02hhx\n", (char) a); printf("0x%02hhx\n", (short) b); return 0; }
Ok, je vois pour les conversions et les pertes d'infos, merci.
Modifié le 6 janv. 2023 à 15:51
Bonjour,
Concernant ton message #8, si j'ai bien compris le but est d'afficher l'octet de poids faible sous forme héxadécimale.
Faire un cast vers un type qui fait un octet fait le travail, même si je trouve ça un peu cavalier personnellement. En effet il y a de bonne chance que l'opération de cast sélectionne les octets des poids faible (ici l'octet de poids faible) pour réaliser le cast. Ensuite il faut bien voir que le cast fait une partie du travail, mais la chaîne de formatage fait le reste, et selon la valeur assignée à l'entier tu utilises tantôt un (char), tantôt un (short).
Bref, ce que je ferais plutôt à ta place, c'est appliquer le masque & 0xff qui va sélectionner le dernier octet, puis afficher la valeur ainsi obtenue.
#include <stdio.h> int main() { int a = 5; int b = 1000; printf("0x%02x\n", a & 0xff) ; printf("0x%02x\n", b & 0xff) ; return 0; }
Pour des types plus grands que des int, tu ne peux pas appliquer un masque directement, donc il faut présenter la donnée (par exemple le float) comme un tableau indexé octet par octet (genre un unsigned char * ou de manière plus parlante un uint8_t *), extraire le bon octet, et l'afficher.
#include <stdio.h> #include <stdint.h> int main() { float a = 5; float b = 1000; printf("0x%02x\n", ((uint8_t *) &a)[sizeof(a) - 1]); printf("0x%02x\n", ((uint8_t *) &b)[sizeof(b) - 1]); return 0; }
Bonne chance
6 janv. 2023 à 20:22
Merci beaucoup pour ces éclaircissements!!!