Wie erkennt der Computer negative Binärzahlen?

6 Antworten

"Erkennen": Gar nicht...

Erstmal ist für den Computer (oder genauer: den Prozessor) absolut alles eine Sequenz von "Spannung über dem Schwellwert" und "Spannung unter dem Schwellwert".

So kann z.B. 01000001 die Zahl 65 sein, der Buchstabe A, die Zahlenfolge 4;1 oder sonstwas...

Deswegen liegen die Daten auch nicht einfach so im Arbeitsspeicher, CPU-Cache oder sonstwo, sondern mit einer "Markierung" (vereinfacht gesagt...).

Das ganze ist allerdings ne ziemlich komplizierte Sache (auch deswegen, weil sich die Bedeutung einer Bitfolge je nach Betrachtung extrem verändern kann)...

Aber mal ein vereinfachtes Beispiel:

Wir arbeiten hier einfach mal mit 4 Bit pro Byte, weils einfacher zu rechnen ist, hier erstmal völlig ausreicht und sich 4 Bit Bytes zur Not auch ohne weiteres auf 8 Bit projezieren lassen.

Wir nehmen eine Dezimalzahl, die -4.

Nun haben wir einen Datentyp, der vorzeichenbehaftete 4 Bit Zahlen aufnehmen kann, also 2⁴=16 verschiedene Werte: -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8

Bei diesem Datentyp gilt (wie auch bei jedem anderen) 0000 = 0.

1000 wäre entsprechend eine 8, also der höchstmögliche Wert.

Was passiert, wenn wir jetzt versuchen, den Wert 1100 (größer als der höchstmögliche Wert) zu interpretieren?

Stell dir das ganze einfach mal so vor, dass die Zahlen von -7 bis 8 auf einer drehbaren Scheibe mit einem Zeiger dran aufgebracht wären.

Bei 0000 steht die Scheibe so, dass der Zeiger auf die 0 zeigt. Für jede Erhöhung des Wertes wird die Scheibe um eine Zahl weitergedreht.

Nach der 8 kommt also die -7, dann die -6, usw.

Allerdings hat der Prozessor selbst keine Information darüber, welche Scheibe wir gerade benutzen, er dreht einfach nur an derselben...

Ob jetzt 1100 -4 bedeutet oder 12 oder etwas völlig anderes, hängt einfach nur davon ab, wie das ganze betrachtet wird.

Das hängt vom Datentyp ab, der die Zahl darstellen soll. Der Datentyp kann N Bits umfassen (z.B. N=8,16,32,64,usw.).

Beispiel : Datentyp umfasst 16 Bits (das Beispiel gilt ebenso für andere Bitbreiten).

Ist der Datentyp als Zahl ohne Vorzeichen definiert, behandelt der Computer die Zahl als positive Zahl von 0 bis 65535.

Ist der Datentyp als Zahl mit Vorzeichen definiert, wird ein Bit für das Vorzeichen reserviert. Damit verbleiben 15 Bit für die eigentliche Zahl, und der Computer kann Zahlen von -32768 bis +32767 darstellen. In diesem Fall werden zwei verschiedene Varianten unterschieden, das Vorzeichen in die 16 Bits zu packen, ändert aber nichts am Ergebnis.

Im Zweierkomplement bestimmt das höchte Bit das Vorzeichen. 0 = +, 1 = -1. Daher kann der Fall, dass 1100 einmal -4 und einmal 12 ist einfach gar nicht auftreten. Das ist immer -4.

Wenn also eine Zahl mit einer 1 beginnt, dann ist immer (IMMER) die negative Zahl gemeint.

Deswegen kannst Du mit 8 Bit im signed Typ auch immer nur die Zahlen von -127 bis +127 darstellen. Nur wenn Du das 8. Bit auch als Wertbit interpretierst, bekommst Du 0 bis 255 (unsigned byte).

Sprich: 10000001 ist immer -1 und niemals 129 im Zweierkomplement.


Du musst unterscheiden zwischen signed und unsigned integer's. 
Bei einem signed integer bestimmt der erste wert einfach das vorzeichen. 0 entspricht + und - entspricht 1.

Das musst du der programmiersprache mitteilen ob das signed oder unsigned ist. standartmäßig wirds wahrscheinlich in den meißten sprachen unsigned sein, aber ich weiß es garnicht. 
Natürlich kann die zahl dann nur halb so groß bzw. klein sein wenn es ein signed integer sein soll. 

Also er erkennt es weil du es ihm mitteilst ob das signed oder unsigned ist. 

weckmannu  15.11.2017, 21:42

Du weißt gar nicht, daß standardmäßig das meiste nicht standardisiert ist, je nach Umgebung wird definiert, was die Bytes oder words bedeuten sollen:

Z.b. Signed, unsigned, ASCII, EBCDIC, real, double precision oder String.

0
jort93  15.11.2017, 23:30
@weckmannu

ja ok, sagte ja schon das ich das nicht weiß. aber der rest stimmt ja noch. aber ich weiß auch nicht ob es dem fragesteller um spezielles geht(sonst hätte er wohl die programmiersprache gennannt). 

0

Der Computer erkennt sowas nicht. In jeder Programmiersprache wird für die numerischen Variablen festgelegt, ob das erste Bit einer Variablen als Vorzeichen betrachtet wird oder als Zahlenwert.