Was ist der vorzeichenlose Datentyp?

88

Ich habe diesen unsigned"typenlosen" Typ ein paar Mal gesehen, aber nie eine Erklärung dafür gesehen. Ich nehme an, es gibt einen entsprechenden signedTyp. 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(Hinweise auf ein 32-Bit-Int ohne Vorzeichen)
- es kann als Abkürzung für das Umwandeln eines anderen Typs in die vorzeichenlose Version verwendet werden:

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

Ist das ANSI C oder nur eine Compiler-Erweiterung?

hhaamu
quelle

Antworten:

140

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

Martin v. Löwis
quelle
30

unsignedbedeutet unsigned int. signedbedeutet signed int. Die Verwendung von just unsignedist eine träge Methode, um ein unsigned intin C zu deklarieren . Ja, dies ist ANSI.

Polaris878
quelle
14

In der Vergangenheit wurde in C angenommen, dass ein Datentyp "int" weggelassen wurde, wenn Sie ihn weggelassen haben. "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.


quelle
6
Mir war nicht bewusst, dass es schlechte Praxis war. Gibt es eine Begründung dafür? longstatt long intist sehr verbreitet, daher bin ich mir nicht sicher, warum unsignedstatt unsigned intnicht akzeptabel wäre.
CB Bailey
10
@ Charles Bailey: Heutzutage - zumindest wenn Sie eher pragmatisch als formal sind - werden long, int, short und char als unterschiedliche Datentypen betrachtet, da sie unterschiedliche Größen haben können, wobei unsigned (und standardmäßig signiert) a ist Qualifikation. Daher würden Sie "unsigned int" genauso verwenden wie "unsigned long" oder "unsigned char" (und es wird deutlich, dass Sie das int nicht einfach verpasst haben). Das int in "long int" oder "short int" ist überflüssig.
Ölmessstab
1
@ Dipstick, "long" ist ein Qualifikationsmerkmal für "int". Das int in "unsigned int" scheint genauso überflüssig zu sein wie das int in "unsigned long int".
Conrad Meyer
1
Dies ist nicht dasselbe wie die implizite "int" -Regel. Diese Antwort ist irreführend.
7

in C unsignedist eine Verknüpfung für unsigned int.

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

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

Dies ist im ANSI-Standard enthalten

ThibThib
quelle
Ja. unsignedwie ist das gleiche , unsigned intaber ich habe eine Suche auf WG14 / N1124 Committee Draft - 6. Mai 2005 ISO / IEC 9899: TC2 für unsignedfinden und konnte nicht in dem festgelegt ist ... könnten Sie den Teil zitieren , wo es definiert ist?
user454322
5

In C und C ++

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

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

Eine vorzeichenlose Ganzzahl ist entweder positiv oder Null.

Vorzeichenbehaftete Ganzzahlen werden in einem Computer unter Verwendung des Zweierkomplements gespeichert.

Rabin Sah
quelle
1

Bring meine Antwort von einer anderen Frage .

Aus der C-Spezifikation , Abschnitt 6.7.2:

- unsigned oder unsigned int

Dies bedeutet, dass unsignedder Typ standardmäßig auf gesetzt wird, wenn er nicht angegeben wird unsigned int. Schreiben unsigned aist also dasselbe wie unsigned int a.

Bruno Ferreira
quelle
1

Nach C17 6.7.2 §2:

Jede Liste von Typspezifizierern muss eines der folgenden Multisets sein (durch Kommas getrennt, wenn mehr als ein Multiset pro Element vorhanden ist). Die Typspezifizierer können in beliebiger Reihenfolge auftreten, möglicherweise gemischt mit den anderen Deklarationsspezifizierern

- void
- char
- signiert char
- unsigned char
- short, signiert short, short int oder signiert short int
- unsigned short oder unsigned short int
- int, signiert oder signiert int
- unsigned oder unsigned int
- long, signiert long , long int oder signiert long int
- unsigned long oder unsigned long int
- long long, signiert long long, long long int oder signiert long long int
- unsigned long long oder unsigned long long int
- float
- double
- long double
- _Bool
- float _Complex
- double _Complex
- long double _Complex - Atomtyp-
Spezifizierer
- Struktur- oder Vereinigungsspezifizierer
- Aufzählungsspezifizierer
- Typedef-Name

Also im Falle von können unsigned intwir entweder schreiben unsignedoder unsigned intoder wenn wir uns verrückt fühlen , int unsigned. Letzteres, da der Standard so dumm ist, dass "... in beliebiger Reihenfolge auftreten kann, möglicherweise vermischt". Dies ist ein bekannter Sprachfehler.

Richtiger C-Code verwendet unsigned int.

Lundin
quelle