Was ist der Unterschied zwischen signed und unsigned int

Lesezeit: 6 Minuten

Benutzeravatar von Moumita Das
Moumita Das

Was ist der Unterschied zwischen signed und unsigned int?

  • Dies ist eine echte Frage, und die Antwort ist nicht so einfach, sondern eher subtil.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    21. April 2011 um 5:36 Uhr

  • Abstimmung zur Wiedereröffnung. Es könnte ein Duplikat sein, aber es ist definitiv eine echte Frage.

    – Brian

    21. April 2011 um 13:27 Uhr

  • Betreff: “Es könnte ein Duplikat sein” – Was ist der Unterschied zwischen unsigned int und signed int in C?

    – Eldarerathis

    21. April 2011 um 21:27 Uhr

  • Weitere Tags sollten hinzugefügt werden, da viele Sprachen sie verwenden.

    – Juan Boero

    19. Juni 2015 um 14:02 Uhr

  • Diese Frage erfordert möglicherweise ein Kapitel, um sie zu erläutern. Wenn Sie die Ins und Outs wissen wollen, überprüfen Sie Vorzeichenlose und vorzeichenbehaftete Ganzzahlen für mehr Erklärung.

    – anonym

    30. Mai 2017 um 2:20 Uhr

Bill Evans bei Mariposas Benutzeravatar
Bill Evans bei Mariposa

Wie Sie wahrscheinlich wissen, ints werden intern binär gespeichert. Typischerweise ein int enthält 32 Bit, kann aber in einigen Umgebungen 16 oder 64 Bit enthalten (oder sogar eine andere Zahl, normalerweise, aber nicht unbedingt eine Zweierpotenz).

Aber schauen wir uns für dieses Beispiel 4-Bit-Ganzzahlen an. Winzig, aber zur Veranschaulichung nützlich.

Da eine solche Ganzzahl vier Bits enthält, kann sie einen von 16 Werten annehmen; 16 ist zwei hoch vier oder 2 mal 2 mal 2 mal 2. Was sind das für Werte? Die Antwort hängt davon ab, ob diese ganze Zahl a ist signed int oder ein unsigned int. Mit einem unsigned int, der Wert ist nie negativ; dem Wert ist kein Vorzeichen zugeordnet. Hier sind die 16 möglichen Werte eines Vier-Bits unsigned int:

bits  value
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000    8
1001    9
1010   10
1011   11
1100   12
1101   13
1110   14
1111   15

… und Hier sind die 16 möglichen Werte eines Vier-Bits signed int:

bits  value
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000   -8
1001   -7
1010   -6
1011   -5
1100   -4
1101   -3
1110   -2
1111   -1

Wie man sieht, z signed ints das wichtigste Bit ist 1 genau dann, wenn die Zahl negativ ist. Deshalb z signed ints ist dieses Bit als “Vorzeichenbit” bekannt.

  • Erwähnenswert ist vielleicht, dass dies das Zweierkomplementformat ist, das zugegebenermaßen heutzutage weit verbreitet ist. Es gibt auch andere Möglichkeiten, ganze Zahlen mit Vorzeichen darzustellen, insbesondere das Einerkomplement.

    – Schedler

    26. April 2011 um 11:59 Uhr

  • Richtig. Und der ISO9899 C-Standard verlangt nicht einmal, dass entweder das Einerkomplement oder das Zweierkomplement verwendet wird; jede andere Konvention, die tatsächlich funktioniert, ist zulässig.

    – Bill Evans bei Mariposa

    26. April 2011 um 15:31 Uhr

  • Obwohl das Zweierkomplement nicht erforderlich ist, (unsigned)(-1) muss der maximal darstellbare Wert für sein unsigned (unabhängig von der binären Darstellung), was trivialerweise für das Zweierkomplement gilt, aber nicht für andere Darstellungen.

    – rubenvb

    23. November 2011 um 11:52 Uhr

  • @BillEvansatMariposa: Der Standard besagt, dass es für vorzeichenbehaftete Ganzzahlen 3 zulässige Darstellungen gibt: Vorzeichen + Größe, 2er-Komplement, 1er-Komplement. Jeder andere müsste für das Programm unsichtbar sein und als einer dieser 3 wahrgenommen werden.

    – Alexey Frunze

    23. November 2011 um 11:57 Uhr

  • Ok, aber unter der Haube! Was WIRKLICH passiert! Was ist der Unterschied zwischen einer SIGNED- und UNSIGNED-Nummer! Wie führt die Maschine die Berechnung durch? Es subtrahiert nur einen Wert von dem anderen? Wie unterscheidet es 1111 = 15 und 1111 = -1?

    – Michail Georgescu

    18. März 2016 um 14:22 Uhr

Für Laien ist ein unsigned int eine ganze Zahl, die nicht negativ sein kann und daher einen höheren Bereich positiver Werte hat, die sie annehmen kann. Ein signed int ist eine Ganzzahl, die negativ sein kann, aber einen niedrigeren positiven Bereich im Austausch für negativere Werte hat, die sie annehmen kann.

  • Manchmal reichen einfache Antworten wie diese aus, um dies zu erklären.

    – nischchalpro

    5. Februar 2021 um 2:05 Uhr

  • Beste Erklärung in einfachen Worten!

    – Wikingerfürst

    23. August um 13:40 Uhr

Benutzeravatar von Keith Thompson
Keith Thompson

int und unsigned int sind zwei verschiedene Integer-Typen. (int kann auch bezeichnet werden als signed intoder nur signed; unsigned int kann auch bezeichnet werden als unsigned.)

Wie die Namen schon sagen, int ist ein unterzeichnet ganzzahliger Typ und unsigned int ist ein ohne Vorzeichen ganzzahliger Typ. Das bedeutet, dass int negative Werte darstellen kann, und unsigned int kann nur nicht negative Werte darstellen.

Die C-Sprache stellt einige Anforderungen an die Bereiche dieser Typen. Die Reichweite von int muss mindestens -32767 .. +32767und die Reichweite von unsigned int muss mindestens 0 .. 65535. Dies impliziert, dass beide Typen mindestens 16 Bit lang sein müssen. Auf vielen Systemen sind sie 32 Bit, auf manchen sogar 64 Bit. int hat aufgrund der Zweierkomplementdarstellung, die von den meisten modernen Systemen verwendet wird, normalerweise einen zusätzlichen negativen Wert.

Der vielleicht wichtigste Unterschied ist das Verhalten von vorzeichenbehafteter und vorzeichenloser Arithmetik. Für unterschrieben int, hat der Überlauf ein undefiniertes Verhalten. Zum unsigned int, es gibt keinen Überlauf; Jede Operation, die einen Wert außerhalb des Bereichs des Typs ergibt, wird umbrochen, also zum Beispiel UINT_MAX + 1U == 0U.

Jeder ganzzahlige Typ, entweder mit oder ohne Vorzeichen, modelliert einen Teilbereich der unendlichen Menge mathematischer Ganzzahlen. Solange Sie mit Werten innerhalb des Bereichs eines Typs arbeiten, funktioniert alles. Wenn Sie sich der unteren oder oberen Grenze eines Typs nähern, stoßen Sie auf eine Diskontinuität, und Sie können unerwartete Ergebnisse erhalten. Bei ganzzahligen Typen mit Vorzeichen treten die Probleme nur bei sehr großen negativen und positiven Werten auf, die überschritten werden INT_MIN und INT_MAX. Bei ganzzahligen Typen ohne Vorzeichen treten Probleme bei sehr großen positiven Werten auf und bei null. Dies kann eine Fehlerquelle sein. Dies ist zum Beispiel eine Endlosschleife:

for (unsigned int i = 10; i >= 0; i --) [
    printf("%u\n", i);
}

because i is always greater than or equal to zero; that’s the nature of unsigned types. (Inside the loop, when i is zero, i-- sets its value to UINT_MAX.)

imran's user avatar
imran

Sometimes we know in advance that the value stored in a given integer variable will always be positive-when it is being used to only count things, for example. In such a case we can declare the variable to be unsigned, as in, unsigned int num student;. With such a declaration, the range of permissible integer values (for a 32-bit compiler) will shift from the range -2147483648 to +2147483647 to range 0 to 4294967295. Thus, declaring an integer as unsigned almost doubles the size of the largest possible value that it can otherwise hold.

Minimus Heximus's user avatar
Minimus Heximus

In practice, there are two differences:

  1. printing (eg with cout in C++ or printf in C): unsigned integer bit representation is interpreted as a nonnegative integer by print functions.
  2. ordering: the ordering depends on signed or unsigned specifications.

this code can identify the integer using ordering criterion:

char a = 0;
a--;
if (0 < a)
    printf("unsigned");
else
    printf("signed");

char is considered signed in some compilers and unsigned in other compilers. The code above determines which one is considered in a compiler, using the ordering criterion. If a is unsigned, after a--, it will be greater than 0, but if it is signed it will be less than zero. But in both cases, the bit representation of a is the same. That is, in both cases a-- does the same change to the bit representation.

  • If this explained the different with one dealing in negative numbers and the other, not. It would help this post a lot.

    – Daniel Jackson

    Nov 18, 2019 at 15:41

  • @DanielJackson Unclear what you say. a char can be considered negative or positive depending on compiler. the output of the code depends on what compiler chooses and this shows the difference between signed and unsigned.

    – Minimus Heximus

    Nov 23, 2019 at 16:27


  • If this explained the different with one dealing in negative numbers and the other, not. It would help this post a lot.

    – Daniel Jackson

    Nov 18, 2019 at 15:41

  • @DanielJackson Unclear what you say. a char can be considered negative or positive depending on compiler. the output of the code depends on what compiler chooses and this shows the difference between signed and unsigned.

    – Minimus Heximus

    Nov 23, 2019 at 16:27


1423500cookie-checkWas ist der Unterschied zwischen signed und unsigned int

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

Privacy policy