Unterschied zwischen Unsigned Int und Signed Int in C

Muhammad Zeeshan 12 Oktober 2023
  1. Unterschied zwischen signed und unsigned Int in C
  2. Speicheranforderungen
  3. Fazit
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 ist signed und muss als Mindestbereichsanforderung einen Bereich von mindestens -32767 bis 32767 haben. Die limits.h bezieht sich auf die tatsächlichen Werte als ihre entsprechenden Werte für INT MIN und INT MAX.
  • Ein unsigned int hat einen Mindestbereich, der sich von 0 bis einschließlich 65535 erstreckt, wobei der tatsächliche Maximalwert durch die UINT_MAX-Konstante der Header-Datei definiert wird. Sie müssen eines der bits nicht für ein Vorzeichen verwenden, wenn der Wert unsigned 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.

  1. Speicherbedarf für ein int sind 4 bytes, was multipliziert mit 8 32 bits ergibt.

    4x8 = 32 bits
    
  2. Zusätzlich nimmt das unsigned int noch bis zu 4 Byte Speicherplatz ein, was zusammen 32 Bit ergibt.

    • Beim Datentyp int ist das bit ganz links in den 32-bits für das Vorzeichenbit 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) bis 2^31-1, was gleich -2 147 483 648 bis 2 147 483 ist 647).

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.

Muhammad Zeeshan avatar Muhammad Zeeshan avatar

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

Verwandter Artikel - C Integer