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?

È stato utile?

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 dei 0 valori o SCHAR_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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top