Comment imprimer unsigned char que 2 chiffres hex valeur dans C?
Je suis en train d'impression d'un unsigned char valeur à 2 Chiffres hex valeur, mais toujours obtenir le résultat sous la forme de 4 Chiffres hex valeurs, vous ne savez pas quel est le problème avec mon code.
//unsigned char declaration
unsigned char status = 0x00;
//printing out the value
printf("status = (0x%02X)\n\r", (status |= 0xC0));
Je m'attends à 2 chiffres hex résultat que 0xC0
, mais je reçois toujours 0xC0FF
.
Ainsi, lorsque j'ai essayé d'imprimer la même variable (statut) comme un unsigned char avec le %bu
identificateur de format j'ai eu de la sortie comme 255
.
Comment obtenez-vous juste que les deux caractères hexadécimaux en sortie?
Il n'y aurait plus les moyens d'expliquer ce qui se passait si la sortie a été 0xFFC0 (même si ce serait presque compilateur bug territoire). Qu'advient-il si vous déplacez le
IDE-Version: µVision V4.02 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009 les Numéros de Version de l'Outil: Chaîne de compilation: PK51 Prof. Kit de Développeurs Version: 9.01 Toolchain Chemin d'accès: C:\Software\Keil\C51\BIN\ Compilateur C: C51.Exe V9.01 Assembleur: A51.Exe V8.02 Éditeur De Liens/Localisateur: BL51.Exe V6.22 Bibliothécaire: LIB51.Exe V4.24 Hex Converter: OH51.Exe V2.6 CPU DLL: S8051.DLL V3.72 Dialogue DLL: DP51.DLL V2.59
Quand je lance un petit programme contenant le code que vous a montré, la sortie est
Comme je le comprends, Keil C génère du code pour le 8051 (un petit CPU pour les systèmes embarqués), et je ne pense pas qu'il soit pleinement conforme à la norme. Votre programme doit fonctionne correctement. J'ai ajouté un "keil" tag; peut-être pour attirer l'attention de quelqu'un qui en sait plus sur les aléas du compilateur que vous utilisez.
Par ailleurs, votre
|=
affectation dans une déclaration distincte avant la printf()
? Si le résultat change, vous n'avez probablement avoir un compilateur bug à traiter. La version de compilateur êtes-vous à l'aide de la version de la plate-forme (o/s)?IDE-Version: µVision V4.02 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009 les Numéros de Version de l'Outil: Chaîne de compilation: PK51 Prof. Kit de Développeurs Version: 9.01 Toolchain Chemin d'accès: C:\Software\Keil\C51\BIN\ Compilateur C: C51.Exe V9.01 Assembleur: A51.Exe V8.02 Éditeur De Liens/Localisateur: BL51.Exe V6.22 Bibliothécaire: LIB51.Exe V4.24 Hex Converter: OH51.Exe V2.6 CPU DLL: S8051.DLL V3.72 Dialogue DLL: DP51.DLL V2.59
Quand je lance un petit programme contenant le code que vous a montré, la sortie est
status = (0xC0)
. Êtes-vous sûr que le code est exactement ce qui est dans votre programme? Écrire un petit programme autonome (avec #include <stdio.h>
et une définition complète de la main()
fonction), et de le présenter à nous avec votre sortie. Copier-coller à la fois; ne pas re-type.Comme je le comprends, Keil C génère du code pour le 8051 (un petit CPU pour les systèmes embarqués), et je ne pense pas qu'il soit pleinement conforme à la norme. Votre programme doit fonctionne correctement. J'ai ajouté un "keil" tag; peut-être pour attirer l'attention de quelqu'un qui en sait plus sur les aléas du compilateur que vous utilisez.
Par ailleurs, votre
printf()
chaîne de format comprend \n\r
. Ce n'est pas l'ordre traditionnel pour le CRLF de fin de ligne: il vous suffit d'écrire normalement \r\n
. Cependant, que très peu à voir avec la sortie du numéro.OriginalL'auteur Asad Waheed | 2012-09-10
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, le Keil compilateur C n'est pas entièrement conforme à la norme. Si oui, il est probable qu'il n'a pas tout à fait conformes à la norme règles de la promotion pour des choses comme passer
char
valeurs de variadic fonctions; sur un 8-bit CPU, il y a des avantages en termes de performances dans pas automatiquement l'expansion de 8 bits des valeurs de 16 bits ou plus.Comme une solution de contournement, vous pouvez explicitement tronquer les bits de poids fort avant de passer à l'argument de
printf
. Essayez ceci:Faire un bit à bit "et" avec
0xFF
efface tout mais le fond de 8 bits; casting pourunsigned int
ne devrait pas être nécessaire, mais elle garantit que l'argument est en fait du type attendu parprintf
avec un"%02X"
format.Vous devriez également consulter votre mise en œuvre de la documentation concernant les non-comportement standard pour le type de promotions et de
printf
.Le
& 0xFF
ne devrait pas être nécessaire, sauf si le compilateur est beaucoup plus cassé que de ne pas implicitement la conversion char arguments de type int. La sortie de 0xC0FF suggère qu'il est en fait pas de faire la conversion, et de prendre les autres de 8 bits à partir de la corbeille sur la pile ou dans un registre. Mais +1 pour la bonne prise.OriginalL'auteur Keith Thompson
vous envoyez un char à une chaîne de format qui attend un int. La fonction printf est saisissant un autre octet hors de la pile pour le remplir. Essayez
Incorrect. Depuis
printf
est un variadic fonction, les arguments de typechar
ouunsigned char
sont promus à laint
(ou, dans certains systèmes exotiques,unsigned int
). Et"%02X"
attendunsigned int
, pasint
.unsigned char
sera promu àint
parce queprintf()
est un variadic fonction (en supposant que<stdio.h>
est inclus). Si l'en-tête n'est pas inclus, alors (un) et (b) vous ne disposez pas d'un prototype dans le champ d'application de launsigned char
sera toujours promuint
.Oublié que la promotion de la règle...
Et il s'avère que j'ai été la plupart du temps correct, par accident. 🙂 L'erreur assurez-vous senti comme un appelant/appelé incompatibilité..
OriginalL'auteur AShelly
Jeter aux unsigned char:
Il voir ici... BTW, le compilateur que vous utilisez?
Si cela ne faire une différence, ce ne serait que parce qu'il était d'éviter certains bug du compilateur. Notez que votre lien donne le même résultat avec les OP du code. (Vous devriez avoir essayé la première.)
IDE-Version: µVision V4.02 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009 Informations sur la Licence: Outil de Numéros de Version: Toolchain: PK51 Prof. Kit de Développeurs Version: 9.01 Toolchain Chemin d'accès: C:\Software\Keil\C51\BIN\ Compilateur C: C51.Exe V9.01 Assembleur: A51.Exe V8.02 Éditeur De Liens/Localisateur: BL51.Exe V6.22 Bibliothécaire: LIB51.Exe V4.24 Hex Converter: OH51.Exe V2.6 CPU DLL: S8051.DLL V3.72 Dialogue DLL: DP51.DLL V2.59
OriginalL'auteur Tutankhamen
En regardant toutes les réponses, je pense que probablement nous manquer, une autre manière de faire.
Si vous utilisez %#04x petit x, alors la sortie sera b 0x x petit préfixe. Le # signe de livre raconte la fonction d'impression de l'0x. 04 instruire combien de chiffres à la sortie, si l'entrée est "0x0a' il va imprimer ce,sans 04 il apparaîtra à l'impression '0xa'.
Dans mon ordinateur, Dell poste de travail, la sortie est attendue par la question. Sauf
Mieux illustré par des exemples:
OriginalL'auteur Kemin Zhou