Bereich von signierten und unsignierten Datentypen

382
user341814

Wenn charalso 1 bytealso 8 Bits sind, richtig?

Also ist 2 ^ 8 = 256 und 0 bis 255 der Bereich von char?

Wie funktioniert das mit signierten und unsignierten Ints? Ein Int ist 4 Byte, also 32 Bit 2 ^ 32. 2 ^ 31 - 1 gibt Ihnen den positiven Bereich der vorzeichenbehafteten Ints an. Was passiert also mit dem 32. Bit? Wird es für das Zeichen verwendet? Wie würde ein Zeichen im Speicher gespeichert werden?

0
"Also wenn char 1 Byte ist, sind es also 8 Bits, oder?" Nur wenn ein Byte 8 Bit hat. Dafür gibt es kein Gesetz, und Computer wurden mit Zeichengrößen von 6, 8, 10 und 12 Bit gebaut. In ähnlicher Weise kann ein "int" (in C) eine Breite von 16 Bit oder mehr haben. In Bezug auf das Zeichen, Google "zwei Komplement". Daniel R Hicks vor 9 Jahren 0

1 Antwort auf die Frage

0
Kenneth L

Wenn der Datentyp als vorzeichenbehafteter Typ definiert ist, gibt es verschiedene Darstellungsarten - hauptsächlich die vorzeichenbehaftete Betragsdarstellung und die Zweierkomplementdarstellung.

Bei der Darstellung der vorzeichenbehafteten Größe wurde das Vorzeichenbit als das höchstwertige Bit (MSB, dh das Bit ganz links) gespeichert. MSB von 0 steht für eine positive Zahl, während 1 für negative Zahl steht. Beispiel:

 7 = 00000111 -7 = 10000111 

Dies ist einfach und (relativ) für Menschen lesbar, jedoch werden Integer-Typen normalerweise nicht für zwei Probleme auf diese Weise beibehalten:

(1) Es gibt zwei Darstellungen für Null, +0 und -0. Es macht es schwierig, Zahlen zu vergleichen, da ein Sonderfall entsteht.

(2) Es ist nicht einfach zu berechnen (so einfach wie das Addieren und Subtrahieren). Das Hinzufügen zweier positiver Zahlen, einer positiven Zahl zu einer negativen Zahl, einer negativen Zahl zu einer positiven Zahl und der Hinzufügung von zwei negativen Zahlen sind vier verschiedene Anwendungsfälle. zB 7 + 6 ist direkt

 1 Carry bit 7 = 00000111 6 = 00000110 (Logic for add) .. ........ 13 = 00001101 

Bei der Berechnung von 7 + (- 6) wird stattdessen die zu verwendende Subtraktionslogik verwendet

 7 = 00000111 -6 = 10000110 (Logic for subtraction) .. ........ 1 = 00000001 

Der Bereich für eine 8-Bit-Zahl ist daher - (2 ^ 7) +1 bis 2 ^ 7-1 (dh -127 bis +127 mit zwei Nullen +0 und -0). Die signierte Betragsdarstellung wird hauptsächlich zum Speichern von Float-Nummern verwendet.

Und das führt zur Komplementendarstellung der beiden. Positive Zahlen werden genauso dargestellt wie die mit Vorzeichen versehene Betragsdarstellung. Das Ändern des Vorzeichenbits erfordert zwei Schritte: (1) Alle Bits umwandeln (alle 0 in 1 und 1 in 0 ändern) (2) Addiere eins.

Beispiel: Um die Darstellung von -6 zu erhalten, führen wir die folgenden Schritte aus

 6 = 00000110 Invert all bits: 11111001 Add one: 11111010 

-6 wird also als dargestellt 11111010. Mit der Zweierkomplementdarstellung können Sie das Vorzeichen immer noch von der MSB ablesen. während es nur eine Darstellung für Null: 00000000.

Es ist auch einfach, Berechnungen mit Binärzahlen in Zweierkomplementdarstellung durchzuführen - Hinzufügen ist Addieren. Mal sehen, wie es funktioniert, 7 + (- 6) zu berechnen:

 1111111 Carry bit 7 = 00000111 -6 = 11111010 (Logic for add) .. ........ 1 = 00000001 

Der Bereich für eine 8-Bit-Zahl ist daher - (2 ^ 7) bis 2 ^ 7-1 (dh -128 bis +127). Beachten Sie, dass sich der Bereich von der Darstellung mit Vorzeichen unterscheidet.

Danke für die ** ausführliche ** Antwort. Jetzt muss ich das Kompliment von zwei, die signierte Betragsdarstellung nachschlagen ... user341814 vor 9 Jahren 0