Was ist der vorzeichenlose Datentyp?

Lesezeit: 4 Minuten

Ich habe das gesehen unsigned “typloser” Typ wurde ein paar Mal verwendet, aber nie eine Erklärung dafür gesehen. Ich nehme an, es gibt eine entsprechende signed Typ. Hier ist ein Beispiel:

static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
    next = seed;
}

Was ich bisher gesammelt habe:
– auf meinem System, sizeof(unsigned) = 4 (Hinweis auf ein 32-Bit unsigned int)
– Es könnte als Abkürzung für das Casting eines anderen Typs in die unsignierte Version verwendet werden:

signed long int i = -42;
printf("%u\n", (unsigned)i);

Ist das ANSI C oder nur eine Compiler-Erweiterung?

unsigned ist wirklich eine Abkürzung für unsigned intund so in Standard C definiert.

Benutzeravatar von Polaris878
Polaris878

unsigned meint unsigned int. signed meint signed int. Nur verwenden unsigned ist eine faule Art, an zu deklarieren unsigned int in C. Ja, das ist ANSI.

Historisch gesehen wurde in C, wenn Sie einen Datentyp weggelassen haben, “int” angenommen. „Unsigned“ ist also eine Abkürzung für „unsigned int“. Dies wurde lange Zeit als schlechte Praxis angesehen, aber es gibt immer noch eine ganze Menge Code, der es verwendet.

  • Ich war mir nicht bewusst, dass es eine schlechte Praxis war. Gibt es dafür eine Begründung? long Anstatt von long int ist sehr verbreitet, also bin ich mir nicht sicher warum unsigned Anstatt von unsigned int wäre nicht akzeptabel.

    – CB Bailey

    23. Juli 2009 um 19:41 Uhr

  • @Charles Bailey: Heutzutage – zumindest wenn Sie eher pragmatisch als formell sind – gelten long, int, short und char als unterschiedliche Datentypen, da sie unterschiedliche Größen haben können, wobei unsigned (und der Standardwert signed) a ist Qualifikation. Daher würden Sie dazu neigen, “unsigned int” auf die gleiche Weise zu verwenden, wie Sie “unsigned long” oder “unsigned char” verwenden würden (und es macht deutlich, dass Sie nicht nur das int verpasst haben). Das int in „long int“ oder „short int“ ist überflüssig.

    – Messstab

    25. Juli 2009 um 21:02 Uhr

  • @Dipstick, “long” ist ein Qualifizierer für “int”. Anscheinend ist das int in „unsigned int“ genauso überflüssig wie das int in „unsigned long int“.

    – Konrad Meyer

    12. Dezember 2014 um 0:16 Uhr

  • Dies ist nicht dasselbe wie die implizite “int”-Regel. Diese Antwort ist irreführend.

    Benutzer3920237

    19. Januar 2015 um 23:43 Uhr

in C, unsigned ist eine Abkürzung für unsigned int.

Sie haben das gleiche für long das ist eine Abkürzung für long int

Und es ist auch möglich, a zu deklarieren unsigned long (es wird ein unsigned long int).

Dies ist im ANSI-Standard enthalten

Benutzeravatar von Rabin Sah
Rabin Sah

In C und C++

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

Eine vorzeichenlose Ganzzahl mit n Bits kann einen Wert zwischen 0 und (2^n-1) haben, was 2^n verschiedenen Werten entspricht.

Eine Ganzzahl ohne Vorzeichen ist entweder positiv oder Null.

Ganzzahlen mit Vorzeichen werden in einem Computer unter Verwendung des Zweierkomplements gespeichert.

Benutzeravatar von Lundin
Lundin

Gemäß C17 6.7.2 §2:

Jede Liste von Typbezeichnern muss eines der folgenden Multisets sein (durch Kommas getrennt, wenn es mehr als ein Multiset pro Element gibt); die Typbezeichner können in beliebiger Reihenfolge auftreten, möglicherweise vermischt mit den anderen Deklarationsbezeichnern

– Leere
— Zeichen
— signiertes Zeichen
— unsigned char
— short, signed short, short int oder signed short int
— unsigned short oder unsigned short int
— int, signed oder signed int
— unsigned oder unsigned int
— lang, vorzeichenbehaftet lang, lange int oder vorzeichenbehaftet lang int
— unsigned long oder unsigned long int
— lang lang, vorzeichenbehaftet lang lang, lang lang int oder vorzeichenbehaftet lang lang int
— unsigned long long oder unsigned long long int
– schweben
– doppelt
– langes Doppel
— _Bool
— Float _Complex
— doppelter _Komplex
— langer doppelter _Komplex
— atomarer Typbezeichner
— Struct- oder Union-Spezifizierer
— Aufzählungsbezeichner
— Typedef-Name

Also im Falle von unsigned int wir können entweder schreiben unsigned oder unsigned intoder wenn wir uns verrückt fühlen, int unsigned. Letzteres, da der Standard dumm genug ist, “… kann in beliebiger Reihenfolge vorkommen, möglicherweise gemischt” zuzulassen. Dies ist ein bekannter Fehler der Sprache.

Richtiger C-Code wird verwendet unsigned int.

Benutzeravatar der Community
Gemeinschaft

Bringe meine Antwort von einer anderen Frage.

Von dem C-SpezifikationAbschnitt 6.7.2:

— unsigned oder unsigned int

Bedeutet, dass unsignedwenn der Typ nicht angegeben ist, wird standardmäßig verwendet unsigned int. Also schreiben unsigned a ist das gleiche wie unsigned int a.

1421600cookie-checkWas ist der vorzeichenlose Datentyp?

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

Privacy policy