J'ai vu ce type unsigned
"sans type" utilisé plusieurs fois, mais je n'ai jamais vu d'explication. Je suppose qu'il existe un type signed
correspondant. Voici un exemple:
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;
}
Ce que j'ai rassemblé jusqu'à présent:
- sur mon système, sizeof(unsigned) = 4
(fait allusion à un entier non signé 32 bits)
- il peut être utilisé comme raccourci pour transtyper un autre type en version non signée:
signed long int i = -42;
printf("%u\n", (unsigned)i);
Est-ce que c'est ANSI C, ou juste une extension de compilateur?
unsigned
est vraiment un raccourci pour unsigned int
, et est donc défini dans la norme C.
unsigned
signifie unsigned int
. signed
signifie signed int
. Utiliser simplement unsigned
est une façon paresseuse de déclarer un unsigned int
en C. Oui, il s'agit d'ANSI.
Historiquement en C, si vous avez omis un type de données "int" était supposé. Donc "unsigned" est un raccourci pour "unsigned int". Cela a longtemps été considéré comme une mauvaise pratique, mais il y a toujours pas mal de code qui l'utilise.
dans C, unsigned
est un raccourci pour unsigned int
.
Vous avez le même pour long
qui est un raccourci pour long int
Et il est également possible de déclarer un unsigned long
(ce sera un unsigned long int
).
Ceci est dans la norme ANSI
En C et C++
unsigned = unsigned int (Integer type)
signed = signed int (Integer type)
Un entier non signé contenant n bits peut avoir une valeur comprise entre 0 et .__ (2 ^ n-1), ce qui correspond à 2 ^ n valeurs différentes.
Un entier non signé est positif ou nul.
Les entiers signés sont stockés dans un ordinateur en utilisant le complément à 2.
Apportant ma réponse à une autre question .
À partir de la spécification C , section 6.7.2:
- unsigned, ou unsigned int
Cela signifie que unsigned
, lorsque le type n'est pas spécifié, doit par défaut être unsigned int
. Donc, écrire unsigned a
est identique à unsigned int a
.
Selon C17 6.7.2 §2:
Chaque liste de spécificateurs de type doit être l'un des multisets suivants (délimités par des virgules lorsqu'il y a plus d'un multiset par élément); les spécificateurs de type peuvent apparaître dans n'importe quel ordre, éventuellement mélangés aux autres spécificateurs de déclaration
- vide
- char
- personnage signé
- caractère non signé
- court, signé court, court int ou court signé int
- unsigned short, ou unsigned short int
- int, signé ou signé int
- unsigned, ou unsigned int
- long, signé long, long int, ou signé long int
- unsigned long, ou unsigned long int
- long long, signé long long, long long int, ou signé long long int
- unsigned long long, ou unsigned long long int
- float
- double
- double long
- _Bool
- float _Complex
- double _Complexe
- double long _Complexe
- spécificateur de type atomique
- spécificateur struct ou union
- spécificateur enum
- nom de typedef
Donc, dans le cas de unsigned int
, nous pouvons écrire unsigned
ou unsigned int
, ou si nous nous sentons fous, int unsigned
. Ce dernier, étant donné que le standard est suffisamment stupide pour permettre "... peut se produire dans n’importe quel ordre, éventuellement mélangé". C'est un défaut connu de la langue.
Le code C approprié utilise unsigned int
.