2015-01-18 11 views
55

So che gli interi senza segno sono solo numeri positivi (e 0) e possono avere il doppio del valore rispetto a un normale int. Ci sono delle differenze traQual è l'uso effettivo della parola chiave "firmata"?

int variable = 12; 

E:

signed int variable = 12; 

Quando e perché si dovrebbe usare la parola chiave firmato?

+18

Quasi mai. È implicito. Una possibile eccezione è 'firmata char'; lo standard non specifica se il semplice 'char' è firmato o non firmato, quindi se per qualche motivo vuoi specificamente un carattere firmato, devi dirlo esplicitamente. –

+2

Lo uso per mostrare che il numero è esplicitamente firmato, più di un promemoria per il lettore. –

+5

@IgorTandetnik Ancora di più, 'char',' signed char' e 'unsigned char' sono * tre * tipi distinti. Per tutti gli altri tipi interi, 'X' e' signed X' sono gli stessi. – Angew

risposta

89

C'è solo una istanza in cui è possibile utilizzare la parola chiave signed. signed char è sempre un tipo diverso da "plain" char, che può essere un tipo firmato o non firmato a seconda dell'implementazione.

C++ 14 3.9.1/1 dice:

È dall'implementazione se un oggetto char può contenere valori negativi. I caratteri possono essere dichiarati esplicitamente unsigned o signed. Pianura char, signed char e unsigned char sono tre tipi distinti [...]

In altri contesti signed è ridondante.


Prima di C++ 14, (e in C), c'era una seconda istanza: campi di bit. È stato definito dall'implementazione se, ad esempio, int x:2; (nella dichiarazione di una classe) è uguale a unsigned int x:2; o uguale a signed int x:2.

C++ 11 9.6/3 dicono:

È implementazione definita se un'unita (né esplicitamente né firmati senza segno) char, short, int, long o long long campo bit è firmato o non firmato.

Tuttavia, poiché C++ 14 questo è stato modificato in modo che int x:2; significa sempre signed int.Link to discussion

+4

e si noti che storicamente, i compilatori basati su PowerPC hanno considerato 'char' come' unsigned' di default, mentre x86 e ARM lo hanno trattato come 'signed'. – fluffy

+1

@fluffy: Se 'char' è 8 bit e il set di caratteri sorgente è EBCDIC, quindi' char' deve, in assenza di una parola chiave 'signed' o' unsigned', essere unsigned, poiché EBCDIC rappresenta le cifre 0-9 con i codici da 0xF0 a 0xF9 e le cifre (così come le lettere e qualsiasi punteggiatura definita nello standard C) devono essere rappresentati da valori di 'char' positivi. BTW, su macchine dove 'char' e' int' hanno la stessa dimensione, 'char' non potrebbe essere equivalente a' unsigned char', poiché 'int' deve essere in grado di contenere tutti i valori di' char', ma 'unsigned char' non può avere padding. – supercat

+1

Perché l'ultimo disegno C++ 11, come N3690/N3797, non ha l'istruzione: "È definito dall'implementazione se un carattere semplice (né esplicitamente firmato né senza segno), breve, int, lungo o lungo -field è firmato o non firmato ". È cambiato? – pezy

8

Nel caso di int, non c'è differenza. Si fa una differenza con char, perché

  1. non è definito se char è firmata o senza segno, e
  2. char, signed char e unsigned char sono tre tipi distinti comunque.

Quindi si dovrebbe usare signed se avete bisogno di un signed char (che è probabilmente raramente). Oltre a questo, non riesco a pensare a una ragione.

+0

buon punto a proposito di char, e per essere onesti, i compilatori (in particolare devstudio) consentono di specificare quale sia l'impostazione predefinita per char – hvanbrug

+0

@hvanbrug: non penso che sia "notevole". Notevole è che GCC ha una tale opzione. –

+2

snobismo del compilatore a parte ho appena parlato di devstudio perché ero sicuro che lo fosse. Non ero sicuro di gcc quindi non ne ho parlato. Inoltre, GCC non è più notevole di dev studio. Se si considera che Windows ha ancora la più grande base di installazione di gran lunga al mondo, è facile vedere che dev studio, e come tale C++ visuale ha molti utenti (come GCC). Detto questo, forse la parola "incluso" avrebbe portato il mio punto di vista meglio di "in particolare". – hvanbrug

0

Non c'è differenza tra i due in cui sono interessati. È possibile includere la parola firmata per la formattazione se si dichiarano anche gli int non firmati in modo che siano più facili da allineare e rendere leggibili, ma a tutti gli effetti non è necessario utilizzare la parola chiave firmata.

+1

"È possibile includere ... per la formattazione" è un motivo davvero insoddisfacente per aggiungere qualcosa al codice. Prima di tutto, le persone dovrebbero sforzarsi di rendere il loro codice semplice ed evitare inutili confusioni rende il codice più semplice. – cmaster

+1

Grazie per la tua opinione @cmaster. A mio parere, la formattazione è un argomento molto importante. Nei miei 30 anni di programmazione ho visto più errori commessi perché lo sviluppatore non poteva leggere il codice e quindi frainteso il significato. Dovrebbe sempre essere su una mente di programmatori assicurarsi che il loro codice sia leggibile perché potresti non essere l'unico a guardarlo e, in ogni caso, in alcuni anni potresti anche non riconoscere il tuo codice. – hvanbrug

+0

@cmaster Penso che tu sia una parola di cherry picking per un motivo di downvote. Leggi di nuovo la sua risposta nel suo insieme. –

4

signed è il tipo intero predefinito. Quindi no, non c'è differenza nell'esempio che hai dato. C'è una differenza solo nel caso di char.

Fonte: C++ Reference

Problemi correlati