www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik hexadezimal zu dezimalzahl


Autor: Schulabbrecher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schulabbrecher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schulabbrecher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ -> Mike

Z80 : DAA
8051 : DA A
AVR :

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

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.