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
Dezimal und Hex sind nur verschiedene Darstellungsformen ein und derselben Information. Programmiersprache?
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.
...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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.