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


von gast (Gast)


Lesenswert?

hallo,

ich habe folgendes problem

long long hat doch 64bit speicherplatz richtig?

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

nun will ich diesen wert mit hilfe von
1
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ß

von Thomas W. (thomas100)


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

von Gast (Gast)


Lesenswert?

1
sprintf(out,"%lx",test)

von (prx) A. K. (prx)


Lesenswert?

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

von Klaus W. (mfgkw)


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.

von Thomas W. (thomas100)


Lesenswert?

Probiers mal mit:
1
sprintf(out,"%llx",test);

von Klaus W. (mfgkw)


Lesenswert?

das gibt genau nichts aus (falls AVR); siehe oben.

von gast (Gast)


Lesenswert?

ok, danke schonmal.

da liegt definitiv das problem

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

von Timmo H. (masterfx)


Lesenswert?

In der inttypes.h von WinAVR steht
1
#ifdef __avr_libc_does_not_implement_long_long_in_printf_or_scanf
2
3
#define    PRIo64      "llo"
4
#define    PRIoLEAST64    "llo"
5
#define    PRIoFAST64    "llo"
6
7
#define    PRIu64      "llu"
8
#define    PRIuLEAST64    "llu"
9
#define    PRIuFAST64    "llu"
10
11
#define    PRIx64      "llx"
12
#define    PRIxLEAST64    "llx"
13
#define    PRIxFAST64    "llx"
14
15
#define    PRIX64      "llX"
16
#define    PRIXLEAST64    "llX"
17
#define    PRIXFAST64    "llX"
18
19
#define    PRIoMAX      "llo"
20
#define    PRIuMAX      "llu"
21
#define    PRIxMAX      "llx"
22
#define    PRIXMAX      "llX"
23
24
#endif

von Klaus W. (mfgkw)


Lesenswert?

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

von gast (Gast)


Lesenswert?

habs jetzt per bitshift gelöst.


gruß

von Klaus W. (mfgkw)


Lesenswert?

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

von gast (Gast)


Lesenswert?

ist atm nur zu testzwecken

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

von blonkel (Gast)


Lesenswert?

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

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.