qual è il tipo di dati non firmato?


90

Ho visto questo unsignedtipo "senza tipo" usato un paio di volte, ma non ho mai visto una spiegazione per questo. Suppongo che ci sia un signedtipo corrispondente . Ecco un esempio:

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;
}

Quello che ho raccolto finora:
- sul mio sistema, sizeof(unsigned) = 4(suggerisce un int senza segno a 32 bit)
- potrebbe essere usato come scorciatoia per lanciare un altro tipo nella versione non firmata:

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

È ANSI C o solo un'estensione del compilatore?

Risposte:


144

unsignedè davvero una scorciatoia per unsigned int, e così definita nello standard C.


30

unsignedsignifica unsigned int. signedsignifica signed int. Usare solo unsignedè un modo pigro di dichiarare un unsigned intin C. Sì, questo è ANSI.


14

Storicamente in C, se si ometteva un tipo di dati "int" è stato assunto. Quindi "unsigned" è un'abbreviazione per "unsigned int". Questa è stata considerata una cattiva pratica per molto tempo, ma c'è ancora una discreta quantità di codice che lo utilizza.


6
Non sapevo che fosse una cattiva pratica. C'è una logica per questo? longinvece di long intè molto comune quindi non sono sicuro del motivo per cui unsignedinvece di unsigned intnon sarebbe accettabile.
CB Bailey

10
@Charles Bailey: in questi giorni - almeno se sei pragmatico piuttosto che formale - long, int, short e char sono considerati tipi di dati diversi in quanto possono essere di dimensioni diverse) con unsigned (e il valore predefinito, signed) è un qualificatore. Quindi tenderesti a usare "unsigned int" nello stesso modo in cui useresti "unsigned long" o "unsigned char" (e rende chiaro che non hai semplicemente perso l'int). L'int in "long int" o "short int" è superfluo.
Asta di livello

1
@Dipstick, "long" è un qualificatore per "int". Sembra che l'int in "unsigned int" sia superfluo quanto l'int in "unsigned long int".
Conrad Meyer

1
Questa non è la stessa della regola "int" implicita. Questa risposta è fuorviante.

7

in C, unsignedè una scorciatoia per unsigned int.

Hai lo stesso perché longè una scorciatoia perlong int

Ed è anche possibile dichiarare a unsigned long(sarà a unsigned long int).

Questo è nello standard ANSI


Sì. unsignedè uguale a unsigned intma ho fatto una ricerca su WG14 / N1124 Committee Draft - 6 maggio 2005 ISO / IEC 9899: TC2 per unsignede non riuscivo a trovare dove è definito ... potresti citare la parte in cui è definito?
user454322

5

In C e C ++

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

Un intero senza segno contenente n bit può avere un valore compreso tra 0 e (2 ^ n-1), ovvero 2 ^ n valori diversi.

Un numero intero senza segno può essere positivo o zero.

I numeri interi con segno vengono memorizzati in un computer utilizzando il complemento di 2.


2

Secondo C17 6.7.2 §2:

Ciascun elenco di identificatori di tipo deve essere uno dei seguenti multinsiemi (delimitato da virgole, quando è presente più di un multinsieme per elemento); gli specificatori di tipo possono verificarsi in qualsiasi ordine, eventualmente mescolati con gli altri specificatori di dichiarazione

- void
- char
- signed char
- unsigned char
- short, signed short, short int o signed short int
- unsigned short o unsigned short int
- int, signed o signed int
- unsigned o unsigned int
- long, signed long , long int, o signed long int
- unsigned long, o unsigned long int
- long long, signed long long, long long int, o signed long long int
- unsigned long long, o unsigned long long int
- float
- double
- long double
- _Bool
- float _Complex
- double _Complex
- long double _Complex
- specificatore di tipo atomico
- specificatore struct o union
- specificatore enum
- nome typedef

Quindi, in caso di unsigned intpossiamo o scrivere unsignedo unsigned int, o se ci si sente pazzo, int unsigned. Quest'ultimo dato che lo standard è abbastanza stupido da consentire "... può verificarsi in qualsiasi ordine, possibilmente mescolato". Questo è un noto difetto della lingua.

Utilizza il codice C corretta unsigned int.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.