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
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
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.
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.
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
> 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.
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.
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.