Forum: Mikrocontroller und Digitale Elektronik Problem mit großen Zahlen


von Phil J. (sunflower_seed)


Lesenswert?

Hallo,

ich habe ein Problem mit avr-gcc und dem Umgang mit großen Zahlen.

Ich muss einen Wert den ich in Sekunden besitze in Stunden umwandeln und 
auf einem Display ausgeben.
Soweit, so gut.

Die Sekunden liegen mir in bis zu vier Hex-Werten vor.
Der maximale Wert ist jeweils 0xFF

Die Werte lassen sich auch einfach zusammentüddeln:

wert1*0x01 + wert2*0x100 + wert3*0x10000

nur spätestens da wird die geschichte ziemlich groß.
Dann muss das ganze noch durch 3600 (0xE10) geteilt werden, damit ich 
meine Stunden hab.

Und wenn ich versuche das ganze auf nem Display mit sprintf auszugeben, 
darf meine variable nicht größer als uint16 sein.

Also wie stelle ich das am besten an?

von Purzel H. (hacky)


Lesenswert?

sprintf() sollte eigentlich tabu sein, ausser allenfalls fuer 
debugzwecke.

Ich wuerd mit longint oder longword arbeiten. Also signed oder unsigned 
32 bit.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Phil J. schrieb:
> Und wenn ich versuche das ganze auf nem Display mit sprintf auszugeben,
> darf meine variable nicht größer als uint16 sein.
Das wären doch immerhin 65535 Stunden...

> Also wie stelle ich das am besten an?
Ich vermute mal, dass dein Ansatz irgendwie verkorkst ist.
Poste mal deinen Code und sag dort, wo es klemmt...

von MitLeser (Gast)


Lesenswert?

Sekundenzähler als unsigend long und dann für die
Stunden durch 3600 teilen. Den Wert auf uint16 prüfen (wenn wichtig
"überlauf" auswerten) und dann in uint16 casten.
Wie Lothar bereits schrieb sind dann halt "nur" max.65535 Stunden.

von Justus S. (jussa)


Lesenswert?

und wiveiel Stellen hinter dem Komma sollen es sein? wenn es nicht 100% 
genau sein soll, dann könnte man Wert1 ignorieren, nur noch wert2*0x01 + 
wert3*0x0100... machen und auch nur durch (3600/256) teilen statt durch 
3600. Dann hätte man beim Zwischenschritt der Gesamtsekunden schonmal 
eine Größenordnung weniger...

von Phil J. (sunflower_seed)


Lesenswert?

Ich habs jetzt mit itoa versucht.
Das geht auch schon mit mehr Stunden.
Aber ich habe bei itoa immer eine kleine Abweichung.
Das ist mir auch schon bei einem anderen Projekt aufgefallen.
Woher kommt das denn?

von Phil J. (sunflower_seed)


Lesenswert?

Das letzte nehme ich zurück.
Muss ja ltoa sein beschämtguck

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.