Forum: Compiler & IDEs sprintf mit uint32_t


von Nils (Gast)


Lesenswert?

Guten Tag zusammen,

ich habe ein kleines Problem mit der Ausgabe eine 32bit Hex Zahl mit 
Hilfe von sprintf und hoffe ihr könnt mir helfen.

Hier der Code:
1
sprintf(buf, "%08x", cf->id );
2
sprintf(buf1, "%08x", (uint32_t)cf->id );
3
sprintf(buf2, "%04x%04x", cf->id >> 16, cf->id );

ergibt mit:
1
usart_write("%s\n\r",buf);
2
usart_write("%s\n\r",buf1);
3
usart_write("%s\n\r",buf2);

00000000
00000000
81010000

Die letztere Zahl ist korrekt. Was ist da los?

(AVR Studio 5, gcc version 4.5.1,GNU Toolchain 3.2.2_315)

Vielen Dank!

Gruß

Nils

von Volkmar D. (volkmar)


Lesenswert?

Der Formatierungsparameter %x (oder auch %08x) gibt einen integer als 
Parameter vor, also nur 16 Bit. Wenn Du einen long haben willst, dann 
sollte wohl %08lx funktionieren.

von Nils (Gast)


Lesenswert?

Hallo Volkmar,

vielen Dank für die schnelle Antwort, das war's...

Gruß

Nils

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Da er nicht long, sondern uint32_t ausgeben will, ist es:
1
#include <inttypes.h>
2
3
   ...
4
   sprintf(buf, "%" PRIu32, number);

von Stefan E. (sternst)


Lesenswert?

PRIx32

von Nils (Gast)


Lesenswert?

Ist das nicht das gleiche wie von Volkmar beschrieben?

1
/** \ingroup avr_inttypes
2
    hexadecimal printf format for uint32_t */
3
#define    PRIx32      "lx"

von Marius W. (mw1987)


Lesenswert?

Klar, aber die Variante mit inttypes.h ist portabler...

MfG
Marius

von DirkB (Gast)


Lesenswert?

Das mit PRIx32 ist der portable Weg.

Da brauchst du dir keine Gedanken machen ob ein int jetzt 2 oder 4 Byte 
sind. Oder ob ein long 8 Byte hat (oder so).

von Nils (Gast)


Lesenswert?

Jupp, macht Sinn...

von Volkmar D. (volkmar)


Lesenswert?

Das nit PRIx32 kannte ich noch nicht, wieder was dazu gelernt ;)

von Klaus W. (mfgkw)


Lesenswert?

Wenn MS das auch irgendwann noch lernt (zusammen mit stdint.h), ist es 
nicht nur Standard, sondern sogar halbwegs portabel.
Oder hat VS2010 das sogar schon, über 10 Jahre nach ISO-C99?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nun, stdint.h gibt es bei VC2010, aber natürlich ebensowenig inttypes.h 
wie es eine C99-Unterstützung gibt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.