was ist der unsigned Datentyp?
Frage
Ich habe die unsigned
„typenlos“ gesehen Art ein paar Mal verwendet, aber nie eine Erklärung dafür gesehen. Ich nehme an, es gibt einen entsprechenden signed
Typen. Hier 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 gesammelt haben bisher:
- auf meinem System, sizeof(unsigned) = 4
(Hinweise auf einen 32-Bit unsigned int)
- es könnte als Abkürzung verwendet werden, um einen anderen Typ der unsignierten Version Gießen:
signed long int i = -42;
printf("%u\n", (unsigned)i);
Ist das ANSI C, oder einfach nur eine Compiler-Erweiterung?
Lösung
unsigned
wirklich ist eine Abkürzung für unsigned int
, und so in Standard-C definiert.
Andere Tipps
unsigned
bedeutet unsigned int
. signed
signed int
bedeutet. nur unsigned
zu verwenden ist eine faule Weise eine unsigned int
in C. deklariert Ja, das ist ANSI.
Historisch gesehen in C, wenn Sie einen Datentyp „int“ weggelassen wurde angenommen. So "unsigned" ist eine Abkürzung für "unsigned int". Dies wurde für eine lange Zeit schlechte Praxis betrachtet, aber es gibt noch eine ganze Menge Code gibt, die es verwendet.
in C, unsigned
ist eine Abkürzung für unsigned int
.
Sie haben das gleiche für long
, die eine Abkürzung für long int
ist
Und es ist auch möglich, eine unsigned long
zu erklären (es wird eine unsigned long int
sein).
Dies ist in dem ANSI-Standard
In C und C ++
unsigned = unsigned int (Integer type)
signed = signed int (Integer type)
n eine ganze Zahl ohne Vorzeichen-Bits enthält, kann einen Wert zwischen 0 und (2 ^ n-1), die 2 ^ n unterschiedliche Werte.
Eine ganze Zahl ohne Vorzeichen ist positiv oder Null ist.
Signed Integer werden in einem Computer gespeichert unter Verwendung von 2-Komplement.
Bringing meiner Antwort von einer anderen Frage .
Von der C-Spezifikation , Abschnitt 6.7.2:
- unsigned oder unsigned int
Was bedeutet, dass unsigned
, wenn sie nicht die Art bestimmt ist, wird auf unsigned int
Standard. So schreibt unsigned a
ist die gleiche wie unsigned int a
.
Nach C17 6.7.2 §2:
Jede Liste von Typdeklarierer wird eine der folgenden Multimengen (durch Kommata getrennt, wenn es mehr als eine multiset pro Element) sein; die Typdeklarierer in beliebiger Reihenfolge auftreten können, die möglicherweise mit der anderen Erklärung Bezeich vermischte
- Leere
- char
- signed char
- unsigned char
- kurze, unterzeichnet kurz, kurz int oder signed short int
- unsigned short oder unsigned short int
- int, signiert, oder int
unterzeichnet - unsigned oder unsigned int
- lange, unterzeichnet lange, lange int oder signed long int
- unsigned long oder unsigned long int
- lange, lange, lange unterzeichnet lange, lange, lange int oder signed long long int
- unsigned long long oder unsigned long long int
- Schwimmer
- Doppel- - lange Doppel- - _Bool
- schwimmen _Complex
- Doppel _Complex
- long double _Complex
- Atom Typspezifizierer
- struct oder union Spezifizierer
- Enum Spezifizierer
- typedef Name
So im Fall von unsigned int
entweder wir unsigned
oder unsigned int
schreiben können, oder wenn wir fühlen verrückt, int unsigned
. Letzteres da der Standard ist dumm genug, um „... in beliebiger Reihenfolge auftreten können, möglicherweise miteinander vermischt“. Dies ist ein bekannter Fehler in der Sprache.
Die richtige C-Code verwendet unsigned int
.