Forum: Mikrocontroller und Digitale Elektronik hexadezimal zu dezimalzahl


von Schulabbrecher (Gast)


Lesenswert?

hallo,
ich habe ein unsigned long welches ich als Wert übernehmen möchte, sehe 
aber keinen Lösungsansatz welcher schnell und effektiv ist (programmiere 
in C und möchte eigentlich keine Vergleichstabelle anlegen! :(

Ich habe also z.B. die Zahl 0x32 und möchte daraus nun 32dec haben (also 
0x20)

das ganze dann aber mit 4 Byte: 0x12345678 soll dann 12345678dec 
(0x00BC614E) werden.

Das kann doch nicht sein dass das so schwer ist, aber egal wie ich 
rechne, ich finde keinen Lösungsweg - wie Rechne ich das!?

von Peter (Gast)


Lesenswert?

Ich verseht noch nicht was du wirklich willst, scheinbar verwechselt du 
etwas.


> das ganze dann aber mit 4 Byte: 0x12345678 soll dann 12345678dec
> (0x00BC614E) werden.
Das würde ja heisen das 0x12345678 = 0x00BC614E und dann kann nie sein.

Alles was mit 0x anfängt ist HEX. Der computer rechner es intern in eine 
Zahl. Computer kennen Hex in dem Sinne gar nicht.

123456dez = 0x1E240
0x1234 = 4660

von Karl H. (kbuchegg)


Lesenswert?

Für 2 Stellen, zb  0x32

   3 * 10 + 2

Jede Stelle einzeln extrahieren und mit einer geeigneten Potenz von 10 
multiplizieren.
Zum extrahieren sind Maskieroperationen mit & hilfreich, sowie 
verschiebeoperationen mittels >>   (am besten unsigned rechnen, sonst 
gibts Ärger mit dem Vorzeichenbit)

Was machst du mit den Hex-Ziffern A, B, C, D, E, F ?

Deine Problemstellung ist aber so ungewöhnlich, dass ich mal stark 
vermute, dass du das falsche Problem löst. Was ist dein wirkliches 
Problem?

von Severino R. (severino)


Lesenswert?

Schulabbrecher wrote:

> Ich habe also z.B. die Zahl 0x32 und möchte daraus nun 32dec haben (also
> 0x20)
>
> das ganze dann aber mit 4 Byte: 0x12345678 soll dann 12345678dec
> (0x00BC614E) werden.

Wenn Du den ersten Teil gelöst hast, ist das Ganze mit 4 Bytes einfach 
vier Mal zu wiederholen.

Frage: wie soll z.B. 0x1234A678 konvertiert werden?
                           ^
Und wozu das Ganze?

von Bernhard R. (barnyhh)


Lesenswert?

Summe := 0

do 8 mal:
    temp := linkestes Nibble(wert) >> 28
    summe := (summe * 10) + temp
    wert := wert << 4
ende

Summe enthält jetzt das gesuchte Ergebnis dieser BCD -> 
Binär-Umwandlung.

In der Großrechnerei nennt sich dieses Datenformat "POV" (packed ohne 
Vorzeichen).

Bernhard

von Mike (Gast)


Lesenswert?

Deine Zahlen sind also in BCD-Darstellung. Jedes Nibble à 4 bit steht 
für eine Dezimalstelle. Der Wert der Zahl ist also

3*10 +2 = 32dec bzw.

((((((1*10+2)*10+3)*10+4)*10+5)*10+6)*10+7)*10+8 = 12345678dec

Um die Zahl vom BCD ins Hex-Format umzurechnen, musst Du also das 
höchstwertige Nibble isolieren, mit 10 multiplizieren, das nächste 
Nibble addieren, usw. Dieses Verfahren nennt man Horner-Schema. Man kann 
die Multiplikation mit 10 auch durch zweimaliges Schieben und Addieren 
ersetzen, wenn Dein Prozesor kein Multiplikationsbefehl hat. Wenn ich 
mich richtig erinnere, gab es beim Z80 dafür einen eigenen Befehl, lang 
ist's her :-).

Gruss
Mike

von Schulabbrecher (Gast)


Lesenswert?

die werte A-F gibt es nicht. ( ist sicher gestellt)

es geht um folgendes - ich habe ein altes Gerät in dessen speicher eben 
Werte stehen (diese Werte kann ich nicht beeinflußen).

Bei diesen Werten handelt es sich aber eigentlich um eine dezimalzahl - 
das alte Gerät gibt den Wert falsch aus!
0x12345678 entspricht in Wirklichkeit dem dezimalwert 12.345.678 dez!

ich bekomme also die falschen Werte übergeben

von Schulabbrecher (Gast)


Lesenswert?

okay Danke euch allen!

ich hab's verstanden und es funktioniert!!

wenn man weiß wie's geht ist es garkein so großer Aufwand :o)

von Matthias L. (Gast)


Lesenswert?

>Bei diesen Werten handelt es sich aber eigentlich um eine dezimalzahl -
>das alte Gerät gibt den Wert falsch aus!
>0x12345678 entspricht in Wirklichkeit dem dezimalwert 12.345.678 dez!

Du meinst eine BCD Zahl, eine binär-codierte-dezimalzahl.
Die macht aus einem "normalen" Byte von 0..255 eine Zahl von 0..99.

von Route_66 (Gast)


Lesenswert?

@ -> Mike

Z80 : DAA
8051 : DA A
AVR :

macht aber nur einen Teil der Wandlung, denn es wird nur dezimal 
"justiert".

von H.Joachim S. (crazyhorse)


Lesenswert?

DAA funktioniert aber nur, wenn es direkt nach Addition/Subtraktion 
angewendet wird.
Es geht damit nicht, eine Hex-Zahl in eine BCD-Zahl zu wandeln.

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.