2009-07-23 6 views
63

Ho visto questo tipo "typeless" unsigned usato un paio di volte, ma mai visto una spiegazione per questo. Suppongo che ci sia un corrispondente tipo signed. Ecco un esempio:qual è il tipo di dati senza segno?

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 (accenna a un 32 bit unsigned int)
- potrebbe essere usato come una scorciatoia per lanciare un altro tipo alla versione unsigned:

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

È questo ANSI C, o semplicemente un'estensione compilatore?

risposta

110

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

23

unsigned mezzi unsigned int. signed significa signed int. Usare solo unsigned è un modo pigro di dichiarare uno unsigned int in C. Sì, questo è ANSI.

6

in C, unsigned è una scelta rapida per unsigned int.

avete lo stesso per long che è una scorciatoia per long int

ed è anche possibile dichiarare una unsigned long (sarà un unsigned long int).

questo è nella norma ANSI

+0

Sì. 'unsigned' è uguale a' unsigned int' ma ho eseguito una ricerca su _WG14/N1124 Draft del comitato - 6 maggio 2005 ISO/IEC 9899: TC2_ per 'unsigned' e non è stato possibile trovare dove è definito ... potresti citare la parte in cui è definita? – user454322

11

Storicamente in C, se omesso un tipo di dati "int" è stata assunta. Quindi "unsigned" è una scorciatoia per "unsigned int". Questo è stato considerato una cattiva pratica per molto tempo, ma c'è ancora una buona quantità di codice là fuori che lo usa.

+6

Non sapevo che era una cattiva pratica. C'è una motivazione per questo? 'long' invece di' long int' è molto comune quindi non sono sicuro del motivo per cui 'unsigned' invece di' unsigned int' non sarebbe accettabile. –

+10

@Charles Bailey: in questi giorni - almeno se si è pragmatici anziché formali - long, int, short e char sono considerati tipi di dati diversi in quanto possono essere di dimensioni diverse) con unsigned (e l'impostazione predefinita, firmata) un qualificatore. Così si tenderà ad usare "unsigned int" nello stesso modo in cui si useranno "unsigned long" o "unsigned char" (e chiarisce che non si è semplicemente mancato l'int). L'int in "long int" o "short int" è superfluo. – Dipstick

+1

@Dipstick, "long" è un qualificatore per "int". Sembra che l'int in "unsigned int" sia altrettanto superfluo dell'int in "unsigned long int". –

3

In C e C++

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

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

Un numero intero senza segno è positivo o uguale a zero.

Gli interi con segno vengono memorizzati in un computer utilizzando il complemento a 2.

0

Portare il mio answer from another question.

Dalla C specification, sezione 6.7.2:

- non firmato, o unsigned int

significa che unsigned, quando non è specificato il tipo, si imposterà unsigned int. Quindi scrivere unsigned a equivale a unsigned int a.