Hallo ich habe eine Frage, wie kann ich aus einer 8 Bit Zahl eine 8 Bit 2-Komplementzahl die von -127 bis + 128 zählt. Das Höchstwertige Bit bestimmt dabei das Vorzeichen. z.B. 2 0 0000010 1 0 0000001 0 0 0000000 ------------ -1 1 1111111 -2 1 1111110 usw... Im Moment versuche ich mit data = (((data<<1)/(1<<1))+127); die Zahl darzustellen, allerdings bricht er jedes mal wenn er ins negative gehen soll um und geht ins positive. Ich hoffe jemand hat ne Idee und kann mir weiter helfen. MfG Paul
data ist ein 8 Bit integer int8_t data; Das Programm soll auf einem Atmega128 laufen.
Du mußt gar nichts machen, die CPU rechnet ja selber im 2-er Komplement. Es hängt also nur vom Typ ab (signed oder unsigned), ob 0xFF als -1 oder +255 angesehen wird: unsigned char i = 255; signed char j; signed int k; j = i; // nun ist j = -1 k = i; // k = 255, da 255 auch in 16 Bit als signed paßt. k = (signed char)i; // k = -1, da vor der 16 Bit Erweiterung der Typ geändert (gecastet) wurde. Ein Typ-cast macht keinerlei Konvertierung ! Peter
Ich hab das villeicht etwas falsch ausgedrückt, ich habe die 8 Bit Zahl im 2-Komplement vorliegen und möchte eine 8 Bit Dualzahl rausbekommen.
??? Willst Du den Betrag Deiner Zahl haben? Also z.B. -13 soll zu 13 gewandelt werden? Irgendwie verstehe ich Dich nicht, was Du machen willst.
aus soll 128 0 0111111 | 255 11111111 ... 2 00000010 | 130 1 00000001 | 129 0 00000000 | 128 10000000 ------------- | -1 11111111 | 127 01111111 -2 11111110 | 126 ... -127 10000000 | 0 00000000 usw. werden.
Ach so. Du willst die Werte verschieben. Dazu mußt du du doch nur 128 addieren.
wenn bit 7 des istwertes == 0, setze den auf eins, wenn 1 setz ihn auf 0 und caste nach unsigned. MW
Das hab ich gemach, das funktioniert leider nicht. in de Simulation funktioniert das, aber der DA Wandler kann das Ursprungssignal nicht wieder herstellen. Der Gibt bei jedem 0 Durchgang einen Flankenwechsel aus.
Dann stimmt irgendwas an den Codes nicht. Deine Codetabelle stimmt sowieso nicht. signed char läuft nicht von -127 ... +128 sondern von -128 ... +127 Und ne gerade Zahl mit gesetztem 0-Bit und umgekehrt, geht gar nichtr. Signed Binär geht so: -128: 10000000 -127: 10000001 ... -1: 11111111 0: 00000000 +1: 00000001 ... +127: 01111111 Peter
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.