quel est le type de données non signé?

90

J'ai vu ce unsignedtype "sans type" utilisé plusieurs fois, mais je n'ai jamais vu d'explication. Je suppose qu'il existe un signedtype 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 int non signé 32 bits)
- il pourrait être utilisé comme un raccourci pour convertir un autre type en version non signée:

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

Est-ce ANSI C, ou juste une extension de compilateur?

hhaamu
la source

Réponses:

144

unsignedest vraiment un raccourci pour unsigned int, et ainsi défini dans la norme C.

Martin c.Löwis
la source
30

unsignedsignifie unsigned int. signedsignifie signed int. Utiliser just unsignedest une manière paresseuse de déclarer un unsigned intin C. Oui, c'est ANSI.

Polaris878
la source
14

Historiquement en C, si vous omettiez un type de données "int" était supposé. Donc "unsigned" est un raccourci pour "unsigned int". Cela a été considéré comme une mauvaise pratique pendant longtemps, mais il existe encore une bonne quantité de code qui l'utilise.


la source
6
Je ne savais pas que c'était une mauvaise pratique. Y a-t-il une justification à cela? longau lieu de long intest très courant, donc je ne sais pas pourquoi unsignedau lieu de unsigned intne serait pas acceptable.
CB Bailey
10
@Charles Bailey: ces jours-ci - du moins si vous êtes pragmatique plutôt que formel - long, int, short et char sont considérés comme des types de données différents car ils peuvent être de tailles différentes) avec unsigned (et la valeur par défaut, signé) étant un qualificatif. Ainsi, vous auriez tendance à utiliser "unsigned int" de la même manière que vous utiliseriez "unsigned long" ou "unsigned char" (et cela montre clairement que vous n'avez pas simplement manqué l'int). L'int dans "long int" ou "short int" est superflu.
Dipstick
1
@Dipstick, "long" est un qualificatif pour "int". On dirait que l'int dans "unsigned int" est tout aussi superflu que l'int dans "unsigned long int".
Conrad Meyer
1
Ce n'est pas la même chose que la règle implicite "int". Cette réponse est trompeuse.
7

en C, unsignedest un raccourci pour unsigned int.

Vous avez la même chose pour longcela est un raccourci pourlong int

Et il est également possible de déclarer a unsigned long(ce sera a unsigned long int).

C'est dans la norme ANSI

ThibThib
la source
Oui. unsignedest le même que unsigned intmais j'ai fait une recherche sur le projet de comité WG14 / N1124 - 6 mai 2005 ISO / CEI 9899: TC2 pour unsignedet je n'ai pas pu trouver où est défini ... pouvez-vous citer la partie où il est défini?
user454322
5

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), soit 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 de 2.

Rabin Sah
la source
2

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 multisets par élément); les spécificateurs de type peuvent apparaître dans n'importe quel ordre, éventuellement mélangés avec les autres spécificateurs de déclaration

- void
- char
- signé char
- unsigned char
- court, signé court, court int ou signé court int
- non signé court ou non signé court int
- int, signé ou signé int
- non signé ou non signé 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
- long double
- _Bool
- float _Complex
- double _Complex
- long double _Complex
- spécificateur de type atomique
- spécificateur struct ou union
- spécificateur d'énumération
- nom du typedef

Ainsi , en cas de unsigned intnous pouvons soit écrire unsignedou unsigned int, ou si on se sent fou, int unsigned. Ce dernier puisque la norme est assez stupide pour permettre "... peut se produire dans n'importe quel ordre, éventuellement mélangé". Il s'agit d'un défaut connu de la langue.

Le bon code C utilise unsigned int.

Lundin
la source
1

Apportant ma réponse à une autre question .

À partir de la spécification C , section 6.7.2:

- non signé ou non signé

Cela signifie que unsigned, lorsqu'il n'est pas spécifié, le type doit être par défaut unsigned int. Donc, l'écriture unsigned aest la même chose que unsigned int a.

Bruno Ferreira
la source