Forum: Mikrocontroller und Digitale Elektronik Dezimalzahl in Hexzahl umrechnen


von Stefan KM (Gast)


Lesenswert?

Hallo zusammen,

ich möchte gern eine Dezimalzahl in eine Hexzahl umrechnen.
Wie kann ich dies am einfachsten realisieren. Ich möchte zu einer 16bit 
Adresse (EEProm im ATMega64) einen Index addieren, um die nächste 
Speicherzelle beschreiben zu können...

Danke euch

Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dezimal und Hex sind nur verschiedene Darstellungsformen ein und 
derselben Information.

Programmiersprache?

von Uhu U. (uhu)


Lesenswert?

Wenn du den Wert bereits als unsigned int vorliegen hast, dann ist die 
Arbeit bereits fast getan:

   char *pBaseAddress = EEPROM_ADDRESS;
   unsigned iIndex = 5;

Die nächste Schreibadresse ist dann:

   pBaseAddress + iIndex

von Stefan KM (Gast)


Lesenswert?

Ich würde gern ohne Pointer arbeiten wollen

von Uhu U. (uhu)


Lesenswert?

Du willst eine Adresse berechnen - der dafür vorgesehene Datentyp ist 
ein Pointer.

Den kannst du natürlich auch in ein unsigned int umwandeln - per 
typecast.

Der cast ändert am Bitmuster überhaupt nichts, ändert nur die 
Typinformation, die der Compiler zur Übersetzungszeit in seinen Tabellen 
mitführt.

Das ist alles nur eine Frage der Interpretation:

Das Bitmuster 0x41 man interpretieren als dezimal 65, oktal 0101, binär 
1000001, ASCII 'A' usw, usf.

Du kannst aber auch ein Array nehmen, wenn die Startadresse zur 
Übersetzungszeit bekannt ist.

Für den Compiler ist eine Array-Variable eine Pointer-Konstante, während 
ein Pointer eine Variable ist.

Entsprechend kann man in C über einen Pointer indizieren:

   pBaseAddress + iIndex == &pBaseAddress[iIndex]

oder

   *(pBaseAddress + iIndex) == pBaseAddress[iIndex]

& ist der Adressoperator, * der Dereferenzieroperator.
Die erste Zeile vergleicht die Adressen, die zweite die Inhalte der 
Arrayelemente, die adressiert werden.

von Uhu U. (uhu)


Lesenswert?

Wenn du in deinem Programm z.B. folgendes schreibst:

   int i = 25;

dann reserviert der Compiler Speicherplatz für ein int, nimmt die 25 aus 
deinem Quelltext und wandelt sie in die Interndarstellung deines 
Prozessors für 25 (0x19, wenn man es hexadezimal ausdrückt) um und 
erzeugt eine Befehlssequenz, die die 0x19 zur Laufzeit des Programmes in 
die Speicherzelle schreibt, die er für i reserviert hat.

Ich weiß, daß das am Anfang nicht leicht ist, aber du must strikt 
zwischen Übersetzungszeit und Laufzeit unterscheiden.

Der Compiler erledigt üblicherweise alles zur Übersetzungszeit, was er 
überhaupt erledigen kann. Zur Laufzeit wird "nur" das gemacht, was übrig 
bleibt.

Beispiel: Du schreibst

   int i = 20 + 5;

Der Compiler sieht, daß er es mit einem Konstanten-Ausdruck zu tun hat 
und berechnet den zur Übersetzungszeit. Zur Laufzeit wird dann nur noch 
die Binärdarstellung des Wertes in die Speicherzelle geschrieben.

Tipp: Um nachzuvollziehen, was zur Laufzeit passiert, kannst du einen 
Debugger nehmen und dein C-Programm Schrittweise ausführen lassen. Wenn 
du nach jedem Schritt die Variablen ansiehst, die benutzt wurden, dann 
lernst sehr schnell, was dahinter steckt.

von Stefan_KM (Gast)


Lesenswert?

Achtung Leute. Die letzten beiden Beitäge sind nicht von mir, da spielt 
jemand einen Trittbrettfahrer. Finde ich nicht sehr nett.

Was ich machen wollte: ich habe intern eine Uhr, wobei jedes Segment ein 
unsigned char darstellt. Ich möchte jetzt die Zeit (bytes in dez) im 
EEprom speichern, der eine 16bit Adressierung hat. Zusätzlich möchte ich 
maximal 10 Zeiten speichern, und danach die erste Zeit wieder 
überschreiben. So eine Art Ringregister. Ich habe 6 Segment, die 
zusammengehören und das Ganze 10 mal somit also 60 Byte.

Ich möchte nun z.B. die 5. Zeit abrufen, d.h. Speichersegment 24-29 dez.
Und wie komme ich jetzt an diese Adresse heran?

Ich Berechen einfach folgendes unsigned int x= (24%16)+((24/16))<<4;
Anstelle der 24 werden dann die folgenden Werte bis 29 durchlaufen und 
abgespeichert und schon habe ich eine Dez-Zahl - in eine Hex- Zahl 
umgewandelt und das Ganze ohne Pointer.

Danke für Eure Beiträge

von Karl H. (kbuchegg)


Lesenswert?

> abgespeichert und schon habe ich eine Dez-Zahl - in eine Hex- Zahl
> umgewandelt und das Ganze ohne Pointer.

Genau darum geht es.
Du bruachst nichts umwandeln.
Im Rechner sind alles nur Zahlen. Einfach nur Zahlen.

Dezimal, Hex, Binär: Das alles kommt erst ins Spiel wenn
diese Zahlen angezeigt werden sollen. Dann spielt es eine
Rolle ob du das Dezimal, Hex, binär oder meinetwegen zur
Basis 29 angezeigt haben willst. Angezeigt! Im Rechner
sind es immer noch: einfach nur Zahlen.


@ Stefan KM (Gast) [IP: 141.76.45.35

Was soll der Scheiss?
Wenn du Verwirrung stiften willst, dann mach das woanders.
Wenn du den originalen Stefan zum registrieren bringen willst,
dann sag ihm das ins Gesicht anstatt da so dämlich seinen
Namen zu übernehmen.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Der Troll ist ein alter Bekannter und meisten wie hier über Anon-Proxys 
unterwegs, weil seine echte IP 212.201.44.249 auch schon auf der 
schwarzen Liste (Anmeldezwang) steht.

von Uhu U. (uhu)


Lesenswert?

Wieso werden jetzt auch Beiträge mit Themenbezug weggeputzt???

Andereseits bleiben Passagen stehen, die sich auf gelöschte Beiträge 
beziehen.

Was spricht denn dagegen, Trollereien als solche zu kennzeichnen und 
einfach stehen zu lassen? Dann wäre zumindest nachträglich noch 
nachvollziehbar, was hier vorging.

Sehr nützlich finde ich auch, wenn nachträglich bekannt gegeben wird, 
welche Pseudonyme auf denselben Troll zurückgehen.

Man könnte auch Beiträge kennzeichnen, die als über einen Anonymisierer 
geschickt erkannt wurden.

von Dennis (Gast)


Lesenswert?

...hat mich auch gewundert, aber letztendlich stand die lösung ja 
schonmal da....

d.

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.