Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

11

29.06.2012, 07:34

1Bit ist vorreserviert fürs Vorzeichen

Das stimmt nur für float und double / long double, die Fließkommatypen.
Bei Ganzzahlen funktioniert es anders: http://de.wikipedia.org/wiki/Zweierkomplement

12

29.06.2012, 11:29

Was ich herauslesen konnte:
Das Zweierkomplement erhält man, indem man das Einerkomplement bildet und eine 1 addiert. (Einerkomplement: Invertierung der Bits)
Z.B. bei +5 in -5
Einerkomplement: 0000 0101 -> 1111 1010
Zweierkomplement: 1111 1010 -> 1111 1011

Stimmt das so?

lg. denniro
Only God can judge me.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

29.06.2012, 11:59

Ziel ist rein prinzipiell mal, eine Repräsentation zu finden, in der Addition, Subtraktion, positive und negative Zahlen möglichst einfach und natürlich zusammenspielen.
Wenn man einfach nur das höchstwertige Bit als Vorzeichenbit verwenden würde, gäb's da einige Probleme: Auf einmal gibt es zwei Repräsentationen für die Null (positiv und negativ Null), bei arithmetischen Operationen bräuchte man extra Logik, da je nach Vorzeichen der Operanden evtl. anders vorgeangen werden müsste etc. Das ist nicht nur unschön, sondern macht auch die Hardware komplizierter...
Die simple und elegante Lösung: Ich wähle meine Repräsentation von §-a§ genau so, dass §a + (-a)§ zu §0§ überläuft. Und es stellt sich heraus dass das gesuchte Bitpattern für §-a§ genau dem Zweierkomplement entspricht. Netter Nebeneffekt: Das höchstwertige Bit ist genau dann gesetzt, wenn die Zahl negativ ist.
Das funktioniert übrigens für beliebige Zahlensysteme. Für Dezimalzahlen wärs dann eben das Zehnerkomplement...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

14

29.06.2012, 12:25

Netter Nebeneffekt: Das höchstwertige Bit ist genau dann gesetzt, wenn die Zahl negativ ist.

Genau. Also ist das höchstwertige Bit in gewisser Hinsicht ein Vorzeichen-Bit, nämlich insofern, dass du nur dieses eine Bit betrachten musst um festzustellen ob die Zahl negativ oder positiv (bzw. null) ist. Allerdings hast du ja schon gesehen, dass um eine Zahl zu negieren, es nicht ausreicht dieses Bit zu ändern.

15

29.06.2012, 12:29

1Bit ist vorreserviert fürs Vorzeichen

Das stimmt nur für float und double / long double, die Fließkommatypen.
Bei Ganzzahlen funktioniert es anders: http://de.wikipedia.org/wiki/Zweierkomplement

Ziel ist rein prinzipiell mal, eine Repräsentation zu finden, in der Addition, Subtraktion, positive und negative Zahlen möglichst einfach und natürlich zusammenspielen.
Wenn man einfach nur das höchstwertige Bit als Vorzeichenbit verwenden würde, gäb's da einige Probleme: Auf einmal gibt es zwei Repräsentationen für die Null (positiv und negativ Null), bei arithmetischen Operationen bräuchte man extra Logik, da je nach Vorzeichen der Operanden evtl. anders vorgeangen werden müsste etc. Das ist nicht nur unschön, sondern macht auch die Hardware komplizierter...
Die simple und elegante Lösung: Ich wähle meine Repräsentation von §-a§ genau so, dass §a + (-a)§ zu §0§ überläuft. Und es stellt sich heraus dass das gesuchte Bitpattern für §-a§ genau dem Zweierkomplement entspricht. Netter Nebeneffekt: Das höchstwertige Bit ist genau dann gesetzt, wenn die Zahl negativ ist.
Das funktioniert übrigens für beliebige Zahlensysteme. Für Dezimalzahlen wärs dann eben das Zehnerkomplement...


Achso, dann gibt es sozusagen einen Überlauf und bei diesem werden einfach die "höheren" Bits abgeschnitten, somit läufts wieder auf die 0 aus.(bei deinem Beispiel)
Only God can judge me.

16

29.06.2012, 12:33

Netter Nebeneffekt: Das höchstwertige Bit ist genau dann gesetzt, wenn die Zahl negativ ist.

Genau. Also ist das höchstwertige Bit in gewisser Hinsicht ein Vorzeichen-Bit, nämlich insofern, dass du nur dieses eine Bit betrachten musst um festzustellen ob die Zahl negativ oder positiv (bzw. null) ist. Allerdings hast du ja schon gesehen, dass um eine Zahl zu negieren, es nicht ausreicht dieses Bit zu ändern.

Man muss ja noch die anderen Bits invertieren und eine 1 addieren ;)
Only God can judge me.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

29.06.2012, 13:29

Achso, dann gibt es sozusagen einen Überlauf und bei diesem werden einfach die "höheren" Bits abgeschnitten, somit läufts wieder auf die 0 aus.(bei deinem Beispiel)

Richtig

Sagen wir, wir hätten 4 Bit breite Register. Nehmen wir nun die Zahl 6 (0110). Wenn wir nun zu 0110 die Zahl 1010 addieren, erhalten wir 10000. Da unsere Register nur 4 Bit breit sind, läuft das Ergebnis über und es bleibt 0000 übrig. Das Zweierkomplement einer Zahl ist per Definition eben genau die Differenz zu §2^n§ (wobei in unserem Fall §n=4§), also genau jene Zahl, die du addieren musst, um diesen Überlauf zu produzieren. Mit dieser Zahlendarstellung kannst du nun eben positive und negative Zahlen völlig gleich behandeln...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (29.06.2012, 13:42)


18

29.06.2012, 20:41

Achso, dann gibt es sozusagen einen Überlauf und bei diesem werden einfach die "höheren" Bits abgeschnitten, somit läufts wieder auf die 0 aus.(bei deinem Beispiel)

Richtig

Sagen wir, wir hätten 4 Bit breite Register. Nehmen wir nun die Zahl 6 (0110). Wenn wir nun zu 0110 die Zahl 1010 addieren, erhalten wir 10000. Da unsere Register nur 4 Bit breit sind, läuft das Ergebnis über und es bleibt 0000 übrig. Das Zweierkomplement einer Zahl ist per Definition eben genau die Differenz zu §2^n§ (wobei in unserem Fall §n=4§), also genau jene Zahl, die du addieren musst, um diesen Überlauf zu produzieren. Mit dieser Zahlendarstellung kannst du nun eben positive und negative Zahlen völlig gleich behandeln...


Okey danke, ich denke, dass ich es jetzt verstanden habe.

lg. denniro
Only God can judge me.

Werbeanzeige