Unterschied zwischen Unsigned Int und Signed Int in C
Der folgende Artikel untersucht die Unterschiede zwischen signiertem und unsigniertem int
in der Programmiersprache C.
Unterschied zwischen signed
und unsigned
Int in C
Die Unterscheidung zwischen einem signed int
und einem unsigned int
ist bei weitem nicht so kompliziert, wie manche denken. Ein signed int
wird oft als int
dargestellt, aber wenn es um unsigned ints
geht, müssen wir unsigned int
schreiben.
Die Tatsache, dass int
ein Datentyp und unsigned
nur ein Schlüsselwort ist, hat eine spezifische Funktion, die mit der Hardwareebene verbunden ist. Dieser einzigartige Zweck schafft den bedeutenderen Unterschied zwischen den beiden, der in den folgenden Teilen ausführlicher behandelt wird.
- Der Datentyp
int
istsigned
und muss als Mindestbereichsanforderung einen Bereich von mindestens-32767
bis32767
haben. Dielimits.h
bezieht sich auf die tatsächlichen Werte als ihre entsprechenden Werte fürINT MIN
undINT MAX
. - Ein
unsigned int
hat einen Mindestbereich, der sich von0
bis einschließlich65535
erstreckt, wobei der tatsächliche Maximalwert durch dieUINT_MAX
-Konstante der Header-Datei definiert wird. Sie müssen eines derbits
nicht für einVorzeichen
verwenden, wenn der Wertunsigned
ist.
Das bedeutet, dass Sie eine größere Auswahl an positiven
Kodierungen auf Kosten von keinen negativen
Kodierungen erhalten.
Speicheranforderungen
Überprüfen Sie zunächst, wie viel Speicherplatz das signed int
und unsigned int
im System des Computers belegen.
-
Speicherbedarf für ein
int
sind4 bytes
, was multipliziert mit8
32 bits
ergibt.4x8 = 32 bits
-
Zusätzlich nimmt das
unsigned int
noch bis zu4 Byte
Speicherplatz ein, was zusammen32 Bit
ergibt.- Beim Datentyp
int
ist dasbit
ganz links in den32-bits
für dasVorzeichenbit
bestimmt, das angibt, ob die ganze Zahl positiv oder negativ ist.1
steht für einen negativen Wert,0
für einen positiven. - Der Bereich der Ganzzahlen, die derzeit in einer
int
-Variablen gespeichert werden können, ist-(2^31)
bis2^31-1
, was gleich-2 147 483 648
bis2 147 483
ist647
).
- Beim Datentyp
Wenn eine negative Zahl in den Computer eingegeben wird, wird sie als Zweierkomplement dieser Zahl in binärer Form dargestellt. Aus diesem Grund würden die ersten bits
des Speichers immer auf eins
gesetzt, und der Computer würde wissen, dass er auf eine negative Zahl gestoßen ist, wenn er sieht, dass das anfängliche bit
auf 1
gesetzt ist.
Immer wenn wir auf diese Nummer zugreifen, kehrt sie in ihre ursprüngliche Form zurück, indem sie das Komplement von 2
darauf anwendet. Beim Datentyp unsigned int
gibt es jedoch kein solches bit
wie ein Vorzeichenbit
.
Somit stehen uns nun alle 32-Bit
zur Verfügung, um die Daten zu speichern. Der Bereich der Ganzzahlen, die in einem unsigned int
gespeichert werden können, reicht von 0
bis 2^32-1
, was 0
bis 4
, 294
, 967
, 295
entspricht, inklusive.
In der Variable des Datentyps unsigned int
speichert der Computer typischerweise Daten im Binärformat.
Lassen Sie uns ein Beispiel haben. Zu Beginn geben wir der Variable x
einen Anfangswert vom Typ unsigned
.
Als wir dann versuchten, die negative Zahl in der unsigned int
-Variable x
zu speichern, verwendete der Computer das 2er
-Komplement der 123
, um sie als negative Zahl darzustellen. Dann wird diese Darstellung im Speicher der Variablen x
gespeichert.
unsigned int x;
x = -123;
Als wir also die negative -123
in der Variablen y
des Datentyps int
gespeichert haben, nahm der Computer das 2er
-Komplement der -123
, um sie als negative Ganzzahl darzustellen, und speicherte diese dann in der Speicher der Variablen y
.
int y;
y = -123;
Unsigned int
-Variablen enthalten nur positive Werte in Standard-Binärform; kein Vorzeichenbit
wurde reserviert, als wir versuchten, auf seinen Speicher durch den Speicher der x
-Variablen zuzugreifen. Infolgedessen benötigte der Computer keine Konvertierungen, und das zuvor gespeicherte 2
-Komplement wurde wiederhergestellt und als reguläre Binärzahl angezeigt.
printf("%d\n", x);
Als wir versuchten, auf den Speicher der Variablen y
zuzugreifen, stellte der Computer fest, dass es sich um den Datentyp int
handelte. Es suchte dann nach dem bit
links von der 32-bit
-Position ganz links und stellte fest, dass es 1
war.
Als Ergebnis nahm es wieder das Komplement der 2
, fügte ein negatives Vorzeichen (-
) hinzu und druckte das Ergebnis.
printf("%d\n", y);
Vollständiger Quellcode:
#include <stdio.h>
int main() {
unsigned int x;
x = -123;
int y;
y = -123;
printf("%d\n", x);
printf("%d\n", y);
return 0;
}
Ausgabe:
-123
-123
Fazit
Nachdem wir nun mit den Hauptunterscheidungen zwischen vorzeichenbehafteten
und vorzeichenlosen Ganzzahlen
vertraut sind, sollten Sie sich auch darüber im Klaren sein, dass mit beiden Datenformen mehrere Vor- und Nachteile verbunden sind, deren Abwägung ganz von Ihren Bedürfnissen abhängt.
Zum Beispiel sollten Sie unsigned int
verwenden, wenn Sie enorme Zahlen speichern möchten und sicher sind, dass es niemals einen negativen Wert geben wird. Andernfalls wäre es hilfreich, wenn Sie den Datentyp int
verwenden würden.
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn