È char con o senza segno di default?
Domanda
Nel libro "di riferimento completa di C" si dice che char
è per difetto senza segno.
Ma io sto cercando di verificare questo con GCC e Visual Studio. Si sta prendendo come firmato per impostazione predefinita.
Qual è corretta?
Soluzione
Il libro è sbagliata. La norma non specifica se char
pianura è firmato o non firmato.
Infatti, lo standard definisce tre tipi distinti: char
, signed char
e unsigned char
. Se si #include <limits.h>
e poi guardare CHAR_MIN
, è possibile scoprire se char
pianura è signed
o unsigned
(se CHAR_MIN
è minore di 0 o uguale a 0), ma anche in questo caso, il tre tipi sono distinti come quanto lo standard è interessato.
Da notare che char
è speciale in questo modo. Se si dichiara una variabile come int
è al 100% equivalente a dichiarare come signed int
. Questo è sempre vero per tutti i compilatori e le architetture.
Altri suggerimenti
Alok sottolinea , lo standard lascia che fino alla realizzazione.
Per gcc, l'impostazione predefinita è firmato, ma è possibile modificare che con -funsigned-char
. Nota: per gcc in Android NDK, il valore predefinito è unsigned . È possibile anche esplicitamente richiedere i personaggi firmati con -fsigned-char
.
In MSVC, l'impostazione predefinita è firmato, ma è possibile modificare che con /J
.
C99 N1256 progetto 6.2.5 / 15 "Tipi" ha questo da dire circa il sottoscritto-ness di tipo char
:
L'implementazione definisce char avere la stessa gamma, la rappresentazione, e il comportamento sia come char o unsigned char firmati.
e in una nota in calce:
CHAR_MIN
, definito in<limits.h>
, avrà uno dei0
valori oSCHAR_MIN
, e questo può essere usato per distinguere le due opzioni. Indipendentemente dalla scelta effettuata,char
è un tipo separato dagli altri due e non è compatibile con entrambi.
Secondo The C Programming Language libro da Dennis Ritchie, che è il libro standard de-facto per ANSI C, caratteri semplici sia con o senza segno sono dipendenti dalla macchina, ma i caratteri stampabili sono sempre positivi.
Secondo lo standard C la signedness di char pianura è "applicazione definite".
In generale implementatori scelto a seconda di quale era più efficace per attuare il loro architettura. Su sistemi x86 char viene generalmente firmato. Nei sistemi braccio è generalmente privo di firma digitale (Apple iOS è un'eccezione).
Secondo "The C ++ Programming Language" di Bjarne Stroustrup, char
è "implementazione definita". Può essere signed char
o unsigned char
a seconda dell'implementazione. È possibile controllare se char
è firmato o meno utilizzando std::numeric_limits<char>::is_signed
.
Ora, si sa lo standard lascia che fino alla realizzazione.
Ma come verificare un tipo è signed
o unsigned
, come ad esempio char
?
Ho scritto una macro per fare questo:
#define IS_UNSIGNED(t) ((t)~1 > 0)
e testarlo con gcc
, clang
e cl
. Ma non lo faccio certo che sia sempre sicuro per gli altri casi.