Grundlagen - negative Zahlen

NightWalk3r

Well-known member
26 April 2006
45
1
Hi,
im Computer ist es doch möglich positive und negative Zahlen an zugeben.
Negative durch komplement...
aber wie unterscheidet der Rechner nun ob es sich um eine vorzeichenbehaftete oder eine ohne handelt ?

ich meine, überall steht da was von das steht so im speicher mit einer breite von sagen wir 8 bit... da kann doch eine 1111 1111 nicht einmal 255 und einmal -1 bedeuten...
hoffe ihr habt verstanden auf was ich hinaus will
 
Genauso wie er unterscheidet, ob es sich bei irgendwelchen Bits um eine Zahl, einen String oder was weiß ich für Binärdaten handelt: Es muss strukturell festgelegt sein. Z.B. durch eine Angabe wie signed oder unsigned.
 
ja, das ist mir schon klar das des im compiler angegeben werden kann, mh also müsste demach das programm des entscheiden ?!
aber andererseits wäre dann ein rechnen doch kaum möglich ? da das meines wissens die cpu selber macht und der kann ich doch schlecht sagen,
11111111(-1) add 11111111(255)...
 
Ja, das wird im Programm entschieden. Anders ausgedrückt: Es gibt keinerlei Möglichkeit, einer Folge von Bits zu entnehmen, was sie überhaupt darstellt. Das ergibt sich immer nur aus dem Kontext.
In manchen Sprachen (Java, PHP, ...) sind integers grundsätzlich vorzeichenbehaftet, in anderen (C++, ...) gibt es dafür die type modifiers. Gleiches gilt für die Datenspeicherung, z.b. in einer mySQL-Tabelle.

Wie damit auf CPU-Ebene verfahren wird, weiß ich nicht. Ich nehme aber schon an, dass es dort auf elektronischer Ebene Schaltungen für beiderlei Operationen implementiert sind.
 
Auf CPU-Ebene gibt es aber auch noch das EFLAGS-Register, das beim Rechnen involviert wird (z.B. Überlauf und das CarryFlag). Möglicherweise gibt es dort auch ein Flag, was irgendwie irgendwas mit dem Vorzeichen macht. Hab jetzt leider kein Asse-Handbuch hier, aber das wäre mal ein Ansatzpunkt zur Suche.
 
für den Prozessor ist es ja egal, das Ergebnis stimmt ja sowieso, egal ob die Zahlen mit oder ohne Vorzeichen waren. Der Compiler muss danach halt wieder wissen, dass es ein Vorzeichen hatte.

Ob ich jetzt
10 - 70 rechne oder
10 + 186 bei 8 bit ist das beide mal
Code:
      1010
10111010
--------
11000100
Diese Zahl ist einmal 196 und einmal -60 was auch den obigen Ergebnissen entspricht. Der CPU kann es also egal sein ob da ein Vorzeichen ist oder nicht.

MfG respawner
 
Jepp, dem Prozessor ist es egal. Der rechnet nur mit den Binär-Darstellungen 10100101 + 10000010 = 00100111. Der Prozessor sieht nur die Bitmuster und führt mit diesen die gewünschten Operationen aus. In der Regel sind die Binärdarstellungen von Variablen so definiert, dass die signed-/unsigned-Eigenschaft keinen Einfluss auf Rechenregeln hat. Oder warum sollte man sich sonst mit dem vergleichsweise komplizierten Zweierkomplement herumschalgen?

Die Interpretation, was die Bitmuster letztendlich bedeuten übernimmt dann das Programm. Aus diesem Grund spuckt mein MSVC auch immer nur 'ne Warnung aus, wenn ich die Typen mische. Technisch ist die Rechnung kein Problem, jedoch sollte man bei Mischungen von signed und unsigned immer wissen, was man macht, deshalb dennoch die Warnung.

Kannst ja mal gucken, ob du irgendwo ein Handbuch von 'nem DSP (Digital Signal Processor) auftreiben kannst. Mir hat das damals echt viel gebracht, so'n Ding mal durchzublättern.

MfG
Sven
 
in den meisten Systemen wird zur Bestimmung von negativen/Positiven Zahlen eine Zahl vorne abgezweigt und die 1 bzw. 0 gibt dann an, dass die zahl positiv bzw. negativ ist ;)
 
in den meisten Systemen wird zur Bestimmung von negativen/Positiven Zahlen eine Zahl vorne abgezweigt und die 1 bzw. 0 gibt dann an, dass die zahl positiv bzw. negativ ist ;)
darf man fragen was für Systeme? Da ich die Komplentärdarstellung deutlich sinnvoller halte, wobei ich mir die Binärdarstellung aber auch nur bei C angeguckt habe.
edit
das Problem dabei ist ja, dass man verschiedene Fälle abfangen muss wenn man ohne Komplementär arbeitet.
234-123 rechnet man anders als 234-1234. Dann kann man negative Zahlen (oder nur eines davon) addieren subtrahieren. Man müsste da mindestens 3 Routinen dafür haben und davor noch die Vorzeichenbit prüfen sowie eine Prüfung welche Zahl kleiner ist (ich muss zugeben, dass wir (3 Mitstudenten und ich, innerhalb einer Projektarbeit) das für ein Taschenrechner der mit rationalen Zahlen beliebiger (was halt der Speicher her gibt) Genauigkeit rechnen konnte).

MfG respawner
 
Zuletzt bearbeitet:
in den meisten Systemen wird zur Bestimmung von negativen/Positiven Zahlen eine Zahl vorne abgezweigt und die 1 bzw. 0 gibt dann an, dass die zahl positiv bzw. negativ ist ;)
Nicht ganz richtig. Die gängige Binärdarstellung von Fixed-Point Datentypen (z.B. Integer) ist halt das Zweierkomplement...

Binärdarstellung von Zahlen
:arrow: https://en.wikipedia.org/wiki/Signed_number_representations
:arrow: https://en.wikipedia.org/wiki/Computer_numbering_formats
Binärdarstellung im Speicher
:arrow: https://en.wikipedia.org/wiki/Endianness

MfG
Sven