mikrocontroller.net

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


Autor: Paul Momsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörn Bögeholz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Typ hat data?

Autor: Paul Momsen (Gast)
Datum:

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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Momsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Paul Momsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, ich meine natürlich 127.

Autor: Michael Wilhelm (Gast)
Datum:

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

MW

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul

x = y + 128;



Peter

Autor: Paul Momsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Momsen (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.