Forum: Mikrocontroller und Digitale Elektronik 2-Komplement Binäzahl


von Paul Momsen (Gast)


Lesenswert?

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

von Jörn Bögeholz (Gast)


Lesenswert?

Welchen Typ hat data?

von Paul Momsen (Gast)


Lesenswert?

data ist ein 8 Bit integer
int8_t data;
Das Programm soll auf einem Atmega128 laufen.

von Peter Dannegger (Gast)


Lesenswert?

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

von Paul Momsen (Gast)


Lesenswert?

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.

von Unbekannter (Gast)


Lesenswert?

???

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.

von Paul Momsen (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

Ach so. Du willst die Werte verschieben. Dazu mußt du du doch nur 128
addieren.

von Rolf Magnus (Gast)


Lesenswert?

Ähm, ich meine natürlich 127.

von Michael Wilhelm (Gast)


Lesenswert?

wenn bit 7 des istwertes == 0, setze den auf eins, wenn 1 setz ihn auf 0
und caste nach unsigned.

MW

von Peter Dannegger (Gast)


Lesenswert?

@Paul

x = y + 128;



Peter

von Paul Momsen (Gast)


Lesenswert?

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.

von Peter Dannegger (Gast)


Lesenswert?

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

von Paul Momsen (Gast)


Lesenswert?

ja hast recht, war ein Denkfehler drin, der Algo klappt trotdem nicht.

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.