Warum ist der Bereich von int -32768 bis 32767?

Lesezeit: 4 Minuten

Benutzer-Avatar
VJain

Warum ist der Bereich jedes Datentyps auf der negativen Seite größer als auf der positiven Seite?

Zum Beispiel im Falle einer Ganzzahl:

Im Turbo C seine Reichweite ist -32768 zu 32767 und für Visuelles Studio es ist -2147483648 zu 2147483647.

Dasselbe passiert mit anderen Datentypen.

  • Wo würden Sie die Null setzen?

    – Schomz

    1. September 2013 um 12:08 Uhr

  • Da muss man auch 0 sparen!

    – GC268DM

    1. September 2013 um 12:08 Uhr

  • en.wikipedia.org/wiki/Two’s_complement

    – Bartlomiej Lewandowski

    1. September 2013 um 12:09 Uhr

  • Wenn Sie nach den Grenzen von Typen fragen, sollten Sie sie nicht wenigstens richtig machen?

    – Pascal Cuoq

    1. September 2013 um 13:38 Uhr

  • Duplikat: Warum ist der Maximalwert einer vorzeichenlosen n-Bit-Ganzzahl 2 ^ n-1 und nicht 2 ^ n?

    – phuklv

    24. Juni 2017 um 14:58 Uhr

Wegen der Art und Weise, wie Nummern gespeichert werden. Vorzeichenbehaftete Zahlen werden in einer sogenannten “Zweierkomplementnotation” gespeichert.

Denken Sie daran, dass alle Variablen eine bestimmte Anzahl von Bits haben. Wenn das höchstwertige von ihnen, das linke, eine 0 ist, dann ist die Zahl nicht negativ (dh positiv oder null), und die restlichen Bits repräsentieren einfach den Wert.

Wenn jedoch das Bit ganz links eine 1 ist, dann ist die Zahl negativ. Den reellen Wert der Zahl erhält man, indem man 2^n von der dargestellten ganzen Zahl subtrahiert (als vorzeichenlose Größe, einschließlich der 1 ganz links), wobei n die Anzahl der Bits ist, die die Variable hat.

Da für den eigentlichen Wert (die “Mantisse”) der Zahl nur n – 1 Bit übrig bleiben, sind die möglichen Kombinationen 2^(n – 1). Für positive/Null-Zahlen ist dies einfach: Sie gehen von 0 bis 2^(n – 1) – 1. Diese -1 ist für Null selbst verantwortlich – zum Beispiel, wenn Sie nur vier mögliche Kombinationen hätten, diese Kombinationen würde 0, 1, 2 und 3 darstellen (beachten Sie, dass es vier Zahlen gibt): es geht von 0 bis 4 – 1.

Denken Sie bei negativen Zahlen daran, dass das Bit ganz links 1 ist, sodass die dargestellte ganze Zahl zwischen 2^(n – 1) und (2^n) – 1 liegt (Klammern sind dort sehr wichtig!). Allerdings muss man, wie gesagt, 2^n wegnehmen, um den wahren Wert der Zahl zu erhalten. 2^(n – 1) – 2^n ist -(2^(n – 1)) und ((2^n) – 1) – 2^n ist -1. Daher ist der Bereich der negativen Zahlen -(2^(n – 1)) bis -1.

Wenn Sie das alles zusammenzählen, erhalten Sie -2^(n – 1) bis 2^(n – 1) – 1. Wie Sie sehen können, erhält die obere Grenze eine -1, die die untere Grenze nicht hat.

Und deshalb gibt es eine negative Zahl mehr als positive.

Benutzer-Avatar
paxdiablo

Der von C benötigte Mindestbereich ist tatsächlich -32767 bis 32767, da es für das Zweierkomplement, das Einerkomplement und die Vorzeichen-/Größencodierung für negative Zahlen sorgen muss, was alles der C-Standard zulässt. Sehen Annex E, Implementation limits von C11 (und C99) für Einzelheiten zu den Mindestbereichen für Datentypen.

Ihre Frage bezieht sich nur auf die Zweierkomplementvariante und der Grund dafür ist einfach. Mit 16 Bit können Sie 2 darstellen16 (oder 65.536) verschiedene Werte und Null muss einer davon sein. Daher bleibt eine ungerade Anzahl von Werten übrig, von denen die meisten (um einen) negative Werte sind:

 1 thru  32767  = 37267 values
 0              =     1 value
-1 thru -32768  = 32768 values
                  -----
                  65536 values

Sowohl das Einerkomplement als auch die Vorzeichengrößencodierung ermöglichen einen negativen Nullwert (sowie positive Null), was bedeutet, dass ein Bitmuster weniger für die Nicht-Null-Zahlen verfügbar ist, daher der reduzierte Mindestbereich, den Sie im Standard finden .

 1 thru  32767  = 37267 values
 0              =     1 value
-0              =     1 value
-1 thru -32767  = 32767 values
                  -----
                  65536 values

Das Zweierkomplement ist eigentlich ein raffiniertes Codierungsschema, da positive und negative Zahlen mit derselben einfachen Hardware addiert werden können. Andere Codierschemata erfordern in der Regel aufwändigere Hardware, um die gleiche Aufgabe zu erledigen.

Für eine ausführlichere Erklärung, wie das Zweierkomplement funktioniert, siehe die Wikipedia-Seite.

Weil der Bereich Null umfasst. Die Anzahl der verschiedenen Werte, die eine n-Bit-Ganzzahl darstellen kann, ist 2^n. Das bedeutet, dass eine 16-Bit-Ganzzahl 65536 verschiedene Werte darstellen kann. Wenn es sich um eine vorzeichenlose 16-Bit-Ganzzahl handelt, kann sie 0-65535 (einschließlich) darstellen. Die Konvention für vorzeichenbehaftete Ganzzahlen ist die Darstellung von -32768 bis 32767, -214748368 bis 214748367 usw.

  • Warum sollte jemand diese Antwort ablehnen? Es ist vielleicht nicht die vollständigste und detaillierteste Antwort, aber es ist vollständig Korrekt.

    – Meilen Route

    5. Oktober 2016 um 10:44 Uhr

Beim 2er-Komplement sind negative Zahlen bitweise nicht plus 1 definiert, dies reduziert den Bereich der möglichen Zahlen in einer gegebenen Anzahl von Bits um 1 auf der negativen Seite.

Normalerweise ist es aufgrund der Verwendung eines Zweierkomplementsystems zum Speichern negativer Werte beim Umdrehen des Vorzeichenbits einer Ganzzahl in Richtung des Negativen voreingenommen.

Der Bereich sollte sein: -(2^(n-1)) – ((2^(n-1)-1)

1354300cookie-checkWarum ist der Bereich von int -32768 bis 32767?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy