www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik long long und sprintf()


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe folgendes problem

long long hat doch 64bit speicherplatz richtig?

ich habe testweise in eine long long variable den wert
test= 0xFFFFFFFFFFFFFFFF 
(16F = 64bits)
gespeichert

nun will ich diesen wert mit hilfe von
sprintf(out,"%x",test) 
in einen char array schreiben...das array ist groß genug
das geht auch, aber nur mit den ersten 4 Fs....woran liegt das?

sollte long long doch nur 16bit lang sein?


gruß

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Compiler und welche libs benutzt du?
Könnte es sein, dass deine sprintf-implementierung "nur" 16 bit 
unterstützt?

long long ist definiv IMMER 64bit lang

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sprintf(out,"%lx",test)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"%x" steht für "int", "%lx" für "long" und für "long long" sagt dir es 
das Manual von printf.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. der Wert sollte als unsigned deklariert sein, macht aber
letztlich nichts aus, wenn man weiß was man tut.

2. %lx gibt auch nicht long long unsigned (8 Byte) aus, sondern nur
long unsigned (4 Byte).

3. in "normalen" glibc ist %llx das richtige Format für
long long unsigned. In der avr-libc gibt es %llx aber nicht m.W.,
also Pech bei long long.

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal mit:
sprintf(out,"%llx",test);

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das gibt genau nichts aus (falls AVR); siehe oben.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke schonmal.

da liegt definitiv das problem

llx geht leider nicht
lx geht zeigt dann aber nur 32bit an

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der inttypes.h von WinAVR steht
#ifdef __avr_libc_does_not_implement_long_long_in_printf_or_scanf

#define    PRIo64      "llo"
#define    PRIoLEAST64    "llo"
#define    PRIoFAST64    "llo"

#define    PRIu64      "llu"
#define    PRIuLEAST64    "llu"
#define    PRIuFAST64    "llu"

#define    PRIx64      "llx"
#define    PRIxLEAST64    "llx"
#define    PRIxFAST64    "llx"

#define    PRIX64      "llX"
#define    PRIXLEAST64    "llX"
#define    PRIXFAST64    "llX"

#define    PRIoMAX      "llo"
#define    PRIuMAX      "llu"
#define    PRIxMAX      "llx"
#define    PRIXMAX      "llX"

#endif

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da es aber eine hexadezimale Ausgabe ist, geht es zur Not so:
    sprintf( out, "%lx%08lx", ((unsigned long*)&l)[1], ((unsigned long*)&l)[0] );

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs jetzt per bitshift gelöst.


gruß

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist grottenlangsam!
Aber wahrscheinlich aber egal bei Ausgabe, die wird ja nicht
immer laufen.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist atm nur zu testzwecken

ich will nur wissen ob mein dcf empfänger die richtigen sachen 
einsammelt
danach fliegt das wieder raus

Autor: blonkel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Lösung wäre schon gewesen nicht "habs gelöst" :(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.