Autor Thema: signed und unsigned  (Gelesen 4618 mal)

DaCodaaa

  • Gast
Gespeichert
« am: 08. November 2009, 10:47 »
Ich wollte nur mal Interesse wissen woher die CPU weiß ob sie gerade mit einem signed oder unsigned Wert arbeitet. Denn wenn man ein char hat kann man Werte von -127 bis 127 speichern aber unsigned char kann Werte von 0 bis 255 speichern. Mir ist nur unklar woher der Prozessor weiß ob das erste Bit der Zahl bedeutet, dass die Zahl negativ ist oder die Zahl größer ist als 127.
Wie gesagt nur so rein aus Interesse.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #1 am: 08. November 2009, 12:15 »
Soweit ich weiß, ist es dem Prozessor an sich egal, womit er rechnet (zumindest bei Prozessoren, die negative Werte als Zweierkomplement darstellen). Für den Prozessor ist in einer 32-Bit-Variable der Wert -2 gleich dem Wert 4294967294. Das heißt, wenn ich von einer Variable, die 0 ist, zwei abziehe, kommt immer der Wert 0xFFFFFFFE raus, bei signed entspricht der Wert -2 und bei unsigned 4294967294. Nur, wenn man den Wert mit einem anderen vergleicht, muss der Prozessor wissen, ob es signed oder unsigned ist, dazu benutzt man z. B. bei unsigned die Sprungbefehle "ja" (jump if above) und "jb" (jump if below), um herauszufinden, ob der erste der gerade verglichenen Befehle größer bzw. kleiner als der zweite ist. Bei signed würde man eben "jg" (jump if greater) und "jl" (jump if less) benutzen.

An sich ist es also immer der gleiche Wert, die Unterschiede resultieren erst aus den Vergleichen, würde ich behaupten (wobei ich mich auch nur mit x86-Prozessoren beschäftigt habe).

PS: Natürlich gibt es weitere spezielle Befehle für vorzeichenbehaftete Zahlen, mit denen kann man z. B. eine 8-Bit-Zahl auf 16 Bit erweitern und dabei den Wert behalten, auch wenn sie negativ und damit im Zweierkomplement dargestellt ist.

PPS: Nagelt mich hierdrauf nicht fest. :-D

DaCodaaa

  • Gast
Gespeichert
« Antwort #2 am: 08. November 2009, 14:19 »
thx :-)

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. November 2009, 19:32 »
Hallo,


Bei den eigentlichen Rechen- und Vergleichs-Befehlen weiß die CPU nicht womit sie es zu tun hat sondern setzt die 4 Flags C, Z, S und O für beides. Entsprechend der verwendeten Bedingung im nächsten bedingten (Sprung-)Befehl entscheidet sich dann was gemeint war. Diese 4 Flags heißen bei anderen CPUs zwar oft anders haben aber eigentlich immer die selbe Bedeutung. Auch die entsprechenden 14 Bedingungen sind auf allen mir bekannten CPUs identisch implementiert (bei x86 gibts noch ein zusätzliches Parity-Flag und 2 zusätzliche Bedingungen auf anderen CPUs hab ich das noch nicht gesehen). Für die Bedingungen solltest Du die CPU-Datenblätter genau durchlesen.

Der eigentliche Rechenvorgang ist im Zweierkomplement identisch für signed und unsigned. Bei anderen Darstellungsmethoden sähe die Sache natürlich anders aus aber ich kenne keine CPU die was anderes als Zweierkomplement benutzt.

Alpha und Itanium haben etwas andere Konzepte als die 4 Flags aber Du willst bestimmt auf nem normalen PC entwickeln.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

DaCodaaa

  • Gast
Gespeichert
« Antwort #4 am: 09. November 2009, 14:28 »
Zitat
thx  :-)

 

Einloggen