web-dev-qa-db-fra.com

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

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?

77
hhaamu

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

128
Martin v. Löwis

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.

26
Polaris878

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. 

11
anon

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

7
ThibThib

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.

3
Rabindra Sah

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.

1
Bruno Ferreira

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.

0
Lundin