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
intistsignedund muss als Mindestbereichsanforderung einen Bereich von mindestens-32767bis32767haben. Dielimits.hbezieht sich auf die tatsächlichen Werte als ihre entsprechenden Werte fürINT MINundINT MAX. - Ein
unsigned inthat einen Mindestbereich, der sich von0bis einschließlich65535erstreckt, wobei der tatsächliche Maximalwert durch dieUINT_MAX-Konstante der Header-Datei definiert wird. Sie müssen eines derbitsnicht für einVorzeichenverwenden, wenn der Wertunsignedist.
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
intsind4 bytes, was multipliziert mit832 bitsergibt.4x8 = 32 bits -
Zusätzlich nimmt das
unsigned intnoch bis zu4 ByteSpeicherplatz ein, was zusammen32 Bitergibt.- Beim Datentyp
intist dasbitganz links in den32-bitsfür dasVorzeichenbitbestimmt, das angibt, ob die ganze Zahl positiv oder negativ ist.1steht für einen negativen Wert,0fü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 648bis2 147 483ist647).
- 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