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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top