So drucken unsigned char als 2-stellige hex-Wert in C?
Ich versuche, Ausdruck einer unsigned char-Wert als eine 2-Stellige hex-Wert, sondern immer das Ergebnis als 4-Stellige hex-Werte, nicht sicher, was ist Los mit meinem code.
//unsigned char declaration
unsigned char status = 0x00;
//printing out the value
printf("status = (0x%02X)\n\r", (status |= 0xC0));
Ich erwarte eine 2-stellige hex-Ergebnis als 0xC0
, aber ich bekomme immer 0xC0FF
.
Als auch, wenn ich versuchte, zu drucken die gleiche variable (status) als ein unsigned char mit den %bu
format identifier ich habe die Ausgabe als 255
.
Wie bekommt man nur die zwei hex-Zeichen als Ausgabe?
Es würde mehr Möglichkeiten geben, zu erklären, was Los war, wenn der Ausgang war 0xFFC0 (obwohl das wäre hart auf compiler-bug-Gebiet). Was passiert, wenn Sie bewegen Sie den
IDE-Version: µVision V4.02 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009-Tool Version Zahlen: Toolchain: PK51 Prof. Entwickler-Kit-Version: 9.01 Toolchain Pfad: C:\Software\Keil\C51\BIN\ C-Compiler: C51.Exe V9.01 Assembler: A51.Exe V8.02 Linker/Locator: BL51.Exe V6.22 Bibliothekar: LIB51.Exe V4.24-Hex-Konverter: OH51.Exe V2.6 CPU-DLL: S8051.DLL V3.72 Dialog-DLL: DP51.DLL V2.59
Wenn ich ein kleines Programm mit dem code, die Sie zeigte, die Ausgabe ist
Wie ich es verstehe, Keil C generiert code für den 8051 (eine kleine CPU für embedded-Systeme), und ich glaube nicht, dass es voll konform zum C-standard. Ihr Programm sollte der Arbeit richtig auf. Ich habe ein "keil" - tag; vielleicht wird die Aufmerksamkeit von jemandem, der weiß mehr über die Launen der compiler, den Sie verwenden.
Übrigens, Ihr
|=
Zuordnung in eine separate Anweisung vor der printf()
? Wenn das Ergebnis ändert, wahrscheinlich haben Sie noch einen compiler-Fehler zu behandeln. Welche version von welchen compiler benutzt du auf welcher version auf welcher Plattform (o/s)?IDE-Version: µVision V4.02 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009-Tool Version Zahlen: Toolchain: PK51 Prof. Entwickler-Kit-Version: 9.01 Toolchain Pfad: C:\Software\Keil\C51\BIN\ C-Compiler: C51.Exe V9.01 Assembler: A51.Exe V8.02 Linker/Locator: BL51.Exe V6.22 Bibliothekar: LIB51.Exe V4.24-Hex-Konverter: OH51.Exe V2.6 CPU-DLL: S8051.DLL V3.72 Dialog-DLL: DP51.DLL V2.59
Wenn ich ein kleines Programm mit dem code, die Sie zeigte, die Ausgabe ist
status = (0xC0)
. Sind Sie sicher, dass code ist genau, was in Ihrem Programm? Schreiben Sie ein kleines in sich geschlossenes Programm (mit #include <stdio.h>
und eine vollständige definition der main()
- Funktion), und zeigen Sie es uns zusammen mit Ihren output. Kopieren-und-einfügen; nicht re-Typ.Wie ich es verstehe, Keil C generiert code für den 8051 (eine kleine CPU für embedded-Systeme), und ich glaube nicht, dass es voll konform zum C-standard. Ihr Programm sollte der Arbeit richtig auf. Ich habe ein "keil" - tag; vielleicht wird die Aufmerksamkeit von jemandem, der weiß mehr über die Launen der compiler, den Sie verwenden.
Übrigens, Ihr
printf()
format-string enthält \n\r
. Das ist nicht die gewöhnliche Ordnung der CRLF Zeilenende; Sie würden normalerweise schreiben \r\n
. Das sollte jedoch nur sehr wenig haben zu tun mit der Ausgabe von die Anzahl.InformationsquelleAutor Asad Waheed | 2012-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich weiß, die Keil C compiler nicht vollständig konform zum C-standard. Wenn ja, ist es wahrscheinlich, dass es nicht ganz an den standard-promotion-Regeln für Dinge wie die Weitergabe
char
Werte variadischen Funktionen; auf einem 8-bit-CPU, die performance-Vorteile nicht automatisch erweitert 8-bit-Werte auf 16 bit oder mehr.Als workaround kann man explizit abschneiden der höherwertigen bits, bevor er das argument
printf
. Versuchen Sie dies:Tun ein Bitweises "und" mit
0xFF
löscht alle, aber die unteren 8 bits; casting zuunsigned int
sollte nicht notwendig sein, aber es garantiert, dass das argument ist tatsächlich von der Art erwartetprintf
mit einem"%02X"
format.Sollten Sie auch Fragen Sie Ihren Umsetzung der Dokumentation in Bezug auf alle nicht-standard-Verhalten für Typ-Promotionen und
printf
.Die
& 0xFF
sollte nicht erforderlich sein, es sei denn, der compiler ist weit mehr kaputt, als nicht implizit konvertieren von char-Argumente int. Die Ausgabe von 0xC0FF deutet darauf hin, dass es in der Tat nicht tun, die Konvertierung und die Kommissionierung bis die anderen 8 bits aus dem Papierkorb auf dem stack oder Links über in ein register. Aber +1 für die guten zu fangen.InformationsquelleAutor Keith Thompson
Sie senden einen char auf einem format-string die erwartet ein int. Die printf-Funktion greift ein weiteres byte aus dem stack zu füllen es aus. Versuchen
Falsch. Da
printf
ist eine Variable Funktion, die Argumente vom Typchar
oderunsigned char
gefördert werden, umint
(oder, bei einigen exotischen Systemenunsigned int
). Und"%02X"
erwartetunsigned int
, nichtint
.unsigned char
wird gefördertint
weilprintf()
ist eine variadic function (vorausgesetzt<stdio.h>
ist im Lieferumfang enthalten). Wenn der header nicht enthalten ist, dann (a) und (b) Sie nicht über einen Prototyp im Rahmen derunsigned char
wird noch gefördert werden zuint
.Vergessen Sie, dass promotion-Regel...
Und es stellt sich heraus, dass ich meist richtige, durch Zufall. 🙂 Den Fehler sicher Roch wie ein Anrufer/angerufene mismatch..
InformationsquelleAutor AShelly
Warf es zu unsigned char:
Es haben zu arbeiten hier... BTW, welche compiler verwenden Sie?
Wenn das alles einen Unterschied machen, es wäre nur, weil Sie es war, die Vermeidung einige compiler-Fehler. Beachten Sie, dass Ihr link gibt das gleiche Ergebnis mit dem OP-code. (Sollten Sie versucht haben, erste.)
IDE-Version: µVision V4.02 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009 Lizenz-Informationen: - Werkzeug-Version Zahlen: Toolchain: PK51 Prof. Entwickler-Kit-Version: 9.01 Toolchain Pfad: C:\Software\Keil\C51\BIN\ C-Compiler: C51.Exe V9.01 Assembler: A51.Exe V8.02 Linker/Locator: BL51.Exe V6.22 Bibliothekar: LIB51.Exe V4.24-Hex-Konverter: OH51.Exe V2.6 CPU-DLL: S8051.DLL V3.72 Dialog-DLL: DP51.DLL V2.59
InformationsquelleAutor Tutankhamen
Blick auf all die Antworten, ich denke wohl, uns fehlt ein weiterer Weg, dies zu tun.
Wenn Sie %#04x kleine x, dann wird der Ausgang b 0 x klein x-Präfix. Die # Raute sagt die Funktion drucken Sie den 0x. 04 anweisen, wie viele Ziffern-Ausgabe, wenn die Eingabe '0x0a' es wird gedruckt,ohne 04 es wird gedruckt '0xa'.
In meinem computer, Dell workstation, die Ausgabe ist wie erwartet, durch die Frage. Es sei denn,
Besser durch Beispiele veranschaulicht:
InformationsquelleAutor Kemin Zhou