Est char signé ou non par défaut?
Question
Dans le livre « Complete Référence C » il est mentionné que char
est par défaut non signé.
Mais je suis en train de vérifier avec GCC ainsi que Visual Studio. Il prend comme signé par défaut.
Laquelle est correcte?
La solution
Le livre est faux. La norme ne spécifie pas si simple char
est signé ou non signé.
la norme définit En fait, trois types distincts: char
, signed char
et unsigned char
. Si vous #include <limits.h>
puis regardez CHAR_MIN
, vous pouvez savoir si char
plaine est signed
ou unsigned
(si CHAR_MIN
est inférieure à 0 ou égal à 0), mais même alors, trois types sont distincts autant que la norme est concerné.
Notez que la char
est spécial de cette façon. Si vous déclarez une variable comme int
il est 100% équivalent à déclarer comme signed int
. Ceci est toujours vrai pour tous les compilateurs et les architectures.
Autres conseils
Alok souligne , la norme laisse que jusqu'à la mise en œuvre.
Pour gcc, la valeur par défaut est signé, mais vous pouvez modifier cela avec -funsigned-char
. Note: pour gcc dans Android NDK, la valeur par défaut est non signé . Vous pouvez également demander explicitement des caractères signés avec -fsigned-char
.
Sur MSVC, la valeur par défaut est signé, mais vous pouvez modifier cela avec /J
.
C99 N1256 projet 6.2.5 / 15 "Types" a ceci à dire au sujet de la signature ness de type char
:
La mise en œuvre définit l'omble d'avoir la même gamme, la représentation et le comportement que soit signé char ou unsigned char.
et dans une note:
CHAR_MIN
, défini dans<limits.h>
, aura l'une des valeurs0
ouSCHAR_MIN
, et cela peut être utilisé pour distinguer les deux options. Quel que soit le choix,char
est un type distinct des deux autres et ne sont pas compatibles avec les deux.
Selon le livre de langage de programmation C par Dennis Ritchie, qui est la norme de facto livre pour ANSI C, les caractères simples signées ou non signées sont la machine à charge, mais les caractères imprimables sont toujours positifs.
Selon la norme C du signedness de charbon ordinaire est "mise en œuvre Defined".
En général implementors choisi selon le montant le plus efficace de mettre en œuvre sur leur architecture. Sur les systèmes x86 ombles est généralement signé. Sur les systèmes de bras, il est généralement non signé (Apple iOS est une exception).
D'après "Le langage C ++ de programmation" par Bjarne Stroustrup, char
est "mise en œuvre définie". Il peut être signed char
ou unsigned char
en fonction de la mise en œuvre. Vous pouvez vérifier si char
est signé ou non en utilisant std::numeric_limits<char>::is_signed
.
Maintenant, nous connaissons la norme laisse que jusqu'à la mise en œuvre.
Mais comment vérifier un type est signed
ou unsigned
, comme char
?
J'ai écrit une macro pour faire ceci:
#define IS_UNSIGNED(t) ((t)~1 > 0)
et le tester avec gcc
, clang
et cl
. Mais je ne suis pas sûr que c'est toujours sans danger pour les autres cas.