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?

Était-ce utile?

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 valeurs 0 ou SCHAR_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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top