2011-10-12 8 views
6

Ogni volta che ho utilizzato la parola chiave unsigned è stato prima di int o un altro tipo incorporato. Mi chiedevo se ci fossero altri modi per utilizzare unsigned.La parola chiave non firmata può essere utilizzata in modi non ovvi?

  • utente può tipi definiti (classi/struct) utilizzano la parola chiave unsigned?
  • I modelli di mascherine possono essere utilizzati in modo particolare con unsigned?

In caso contrario, perché ha una propria parola chiave? Perché unsigned int non è uint?

+0

A meno che non significa usare 'unsigned' da sola (equivalente a' int' non firmato), non riesco a pensare a nessun altro * * strano caso l'uso. –

+0

Il titolo di questa domanda e l'ultima ... domanda nel testo sono molto diversi. Qual é? – Jon

+1

Ho sempre desiderato poter usare 'unsigned' con una classe' bigint'. –

risposta

4

No, non può essere utilizzato con le classi o le strutture poiché non sono tipi interi. Tutto ciò che un modello può fare con esso è fare un int unsigned. Penso che sia stato scelto come parola chiave separata in quanto può essere applicato a qualsiasi tipo intero (char, int, long, long long), ottenendo così con una parola chiave cosa avrebbe richiesto altri quattro. Il suo significato è anche immediatamente evidente, mentre uint, uchar, ecc. Non sono necessariamente. E ricorda che può anche essere usato da solo senza un qualificatore, nel qual caso si presume int unsigned.

+0

numerico è errato, in realtà dovresti aver detto tipi interi. –

+0

Più precisamente, tipi integrali integrati. BigInt è un tipo integrale. –

+0

@ 0A0D: Tecnicamente, sì, ma ho usato la parola 'numerico' specificamente per evidenziare il fatto che solo i tipi numerici possono avere la qualità di un segno. –

2

No unsigned non è propriamente una parola chiave; è solo un modificatore per int, short, char.

Il unsigned parola chiave può essere utilizzato come modificatore per int, short, char o long. Può anche essere usato da solo come nome del tipo; unsigned significa unsigned int.

E 'stato fatto in questo modo per evitare di avere tre parole chiave aggiuntive uint ushort uchar e perché firmato/non firmato potrebbe non essere stato diverso su tutti i primi computer C e Unix erano mirati a.

+0

beh, in realtà si tratta di un 'modificatore di tipo' non 'modificatore'. Vedi 7.1.5 nello standard ISO C++. –

+0

Vedere questo [collegamento] (http://en.cppreference.com/w/cpp/keywords/unsigned) – COD3BOY

+1

@Sanjay: Non mi interessa cosa dice, vai a leggere lo standard ISO in 7.1.5. http://www-d0.fnal.gov/~dladams/cxx_standard.pdf –

3

unsigned è una parola chiave. unsigned può essere utilizzato solo sui tipi integrali. unsigned o signed è considerato un identificatore di tipo, un semplice identificatore di tipo. Quindi specificano che il tipo sarà firmato o non firmato.

È possibile typedef le parole unsigned int per uint ma poi che farebbero sembrare un tipo quando int è il tipo e unsigned è il tipo-specifier per sé.

È possibile utilizzare unsigned di per sé, contrariamente alla credenza popolare, come evidenziato nella sezione standard C++ ISO 7.1.5.2 Tabella 7:

enter image description here

È possibile utilizzare più di tipo-prescrittori (quando consentito solo) e possono essere liberamente mescolati con decl-specificatori in qualsiasi ordine.

si può anche fare questo:

int unsigned i; 

e questo è valido C++.

1

Le parole chiave firmate, non firmate, brevi e lunghe sono modificatori/identificatori di tipo e quando uno di questi modificatori/identificatori di tipo è utilizzato da solo, si presuppone un tipo di dati di int.

Così firmato e non firmato può anche essere used as standalone type specifiers, che corrisponde allo stesso modo di int firmato e non firmato rispettivamente. Le due dichiarazioni seguenti sono equivalenti:

unsigned abc; 

unsigned int abc; 
5

La domanda principale è stato risposto più volte: la parola unsigned può essere utilizzato solo come tipo specificatore di un tipo integrale.

Per quanto riguarda il motivo per cui unsigned è una parola chiave separata, anziché avere, ad esempio, una parola chiave uint, i motivi sono storici.

Le prime versioni di C (pre-K & R) ha avuto solo quattro tipi fondamentali:

  • char (8 bit, firmato, 2's-complemento)
  • int (16 bit, firmato, 2 di -complement)
  • float (32 bit)
  • double (64 bit, stesso intervallo float ma maggiore precisione)

Nota cosa manca: non signed o unsigned parole chiave, senza short, long, o long double; tutti quelli sono stati aggiunti in seguito. (Programmatori che avevano bisogno di puntatori aritmetici senza segno comunemente usati, che erano liberamente intercambiabili con int)

Ogni tipo fondamentale aveva un nome che era una singola parola chiave, che rendeva la grammatica semplice.

Quando gli altri tipi sono stati aggiunti in seguito, aveva senso aggiungere prescrittori come unsigned, short, e long ai nomi dei tipi esistenti piuttosto che introdurre nuove parole chiave (che potrebbe aver rotto il codice esistente). Quando il comitato ANSI C standardizzò la lingua nel 1989, dovettero fare una struttura coerente fuori dalle definizioni non proprio del tutto formali pur restando coerenti con le implementazioni esistenti. Il risultato è ciò che abbiamo ora, dove int long unsigned long è un nome di tipo valido (più comunemente scritto come unsigned long long).

Se il linguaggio veniva progettato da zero, sospetto che sarebbe stato adottato un approccio diverso. Forse ci sarebbe una singola parola chiave per ogni tipo fondamentale (è l'approccio adottato da C#, ad esempio), o forse i nomi dei tipi fondamentali utilizzerebbero uno schema più coerente piuttosto che un guazzabuglio di parole chiave (per esempio, int:2 per un 2 byte intero, unsigned:4 per un numero intero senza segno a 4 byte). Ma sia C che C++ sono bloccati con l'approccio attuale.

Riferimento: http://cm.bell-labs.com/cm/cs/who/dmr/cman.pdf

0

C'è anche unsigned char. Alcuni compilatori, come GNU's g ++, ti consentono di inserire unsigned e di assumere significhi unsigned. Ad esempio, il seguente codice è equivalente

unsigned int x; 

unsigned x; 
Problemi correlati