hallo leute, vorabinfos: cpu: avr - mega128 compiler: winavr(aktuell) ich möchte eine int64_t zahl in einen string umwandeln damit ich ihn mitdem uart ausgeben kann. ich habs auf diese art versucht: int64_t zahl; char puffer[40]; zahl=...; sprintf(puffer, "%d",(int64_t)zahl); ich hab mir schon die doku zur libc durch gesehen und kapiert dass sprintf auf vfprintf() zurückzuführen ist. aber kann vfprintf mit irgenteinem flag 64bitter konvertieren? ich hoffe ich habs halbwegs rübergebracht was ich nicht hinbekomme. danke schon mal im vorraus, danie
> sprintf(puffer, "%d",(int64_t)zahl);
Das wird mit Sicherheit nichts. %d ist für normale
int, also int16_t. Du musst dir aus der Doku raussuchen
welches Formatierzeichen für long long (das dürfte
ein int64_t sein), zuständig ist.
ich hab gerade noch nach den itoa varianten gesucht, die können auch nur bis max 32 bit :-( muss ich das etwa von hand machen?
hallo Karl heinz danke schon mal für die schnelle AW, dass das so nicht klappt ist mir schon klar. ich find nur in der doku nix passendes was ich satt &d oder %i verwenden müsste, die schalter die ich gefunden habe gehen bis max 32 bit, aber das hilft ja nicht, aber ich bin mir auch nicht sicher ob ich an der richtigen stelle suche ...
wie wärs mit etwas Pointerarithmetik: int64_t x = PINA; int64_t *p64 = &x; char *pc; pc = (char *) p64; PORTB = pc[0];
sorry ich verstehe zwar halbwegst was du da machst, aber dennoch nicht wie mir das weiterhilft? ausserdem warum sollte ich irgentwelche register beschreiben?
werd ich nacher mal testen, muss schnell für 1...2h weg, dann versuch ichs mal. vermute dass das long long dezimal heisst. das wär dann ja genau das was ich brauche. danke schon mal. meld mich dann obs funktioniert hat.
Die Register waren nur bei mir zum Test, sonst optimiert doch der Compiler alles weg... Vielleicht macht mein Programm auch niet 100% das was du willst, so wie's aussieht willst du ja ASCCII-Darstellung, mein Code erzeugt nur ein Byte-Array. Wenn dir das reicht (Die 8 Bytes) dann passt das.
> ich hab gerade noch nach den itoa varianten gesucht, die können auch nur > bis max 32 bit :-( > > muss ich das etwa von hand machen? Ich fürchte fast. In den Header Files bin ich bis auf den Hinweis auf %lld auch nicht fündig geworden. Muss es denn unbedingt int64_t sein?
also %lld und %lli funktionieren nicht. da bekomm ich nur mist. variable: -1 wird als 855703680 ausgegeben, das macht irgentwie keinen sinn. ich werd wohl mal den iterativen hammer auspacken. int64 muss leider sein, das der datensatz derart groß sein kann dennoch mal danke
@hans0815 : ja ich brauch nen echten string den ich ausgeben kann. um die ersten 8 byte zu bekommen wäre eine union wohl lesbarer. dennoch danke. grüße danie
Wenn du das in Hex ausgibst, also erstmal if (n<0L) n=-n,*str++='-'; Dann kannst du ein sprintf auf den str machen, type "%0X%X" fuer 32bit high und 32bit low byte. Das ist das einfachste.
das ist klar, in hex kein problem. ich brauchs dummerweisse in dez ich machs nun iterativ: rechnen variable%10 <- ausgeben | varibale /=10 ^ | | | variable%10 <- ausgeben | variable /=10 ^ | | | variable%10 <- ausgeben | variable /=10 ^ | | . . . . . . . . . | variable%10 <- ausgeben | variable /=10 ^ | | |-> variable -> ausgeben damit werden die variablen immer genau eine stelle lang. man sollte vorher auf >0 abtesten und damit das vorzeichen bestimmen. vielen dank an alle die mitgedacht haben. grüße danie
20 Stellen? Peter Dannegger hat in der Codesammlung eine Routine zur Division von 32Bit-Zahlen veröffentlicht. Die muß man nur (sollte auch ohne Probleme gehen) auf 64Bit erweitern.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.