Question

Je traite actuellement avec le code acheté auprès d'un tiers entrepreneur. Un struct a un champ unsigned char tandis que la fonction qu'ils passent à ce champ nécessite un signed char. Le compilateur n'aime pas, car il les considère comme des types dépareillées. Cependant, il compile apparemment pour cet entrepreneur. Quelques recherches sur Google m'a dit que « [i] t est défini par l'implémentation si un objet char peut contenir des valeurs négatives ». Le compilateur de l'entrepreneur pourrait ne pas tenir compte essentiellement du type signé / non signé et les traiter de la même chose? Ou est-il un indicateur de compilateur qui les traitera les mêmes?

C est pas ma langue la plus forte - il suffit de regarder mes tags sur ma page d'utilisateur -. De sorte que toute aide serait appréciée

Était-ce utile?

La solution

En fait char, signed char et unsigned char sont trois types différents. De la norme (ISO / IEC 9899: 1990):

  

6.1.2.5 Types

     

...

     

Les trois types char , signed char    unsigned char sont collectivement appelés   les types de caractères .

(et en C ++ par exemple, vous devez (ou au moins devrait) écrire des fonctions de remplacement avec trois variantes d'entre eux si vous avez un argument char)

char ordinaire peut être traité signé ou non par le compilateur, mais la norme dit (aussi 6.1.2.5):

  

Un objet déclaré en tant que type char est   assez grand pour stocker tout membre   le caractère d'exécution de base défini. Si   un membre de la source requis   jeu de caractères 5.2.1 est stocké dans un    char objet, sa valeur est garantie   être positif. Si d'autres quantités   sont stockées dans un char objet,   comportement est défini par l'implémentation:   les valeurs sont considérées comme étant soit   signé ou des entiers non négatifs.

et

  

Un objet déclaré comme type char signé occupe la même quantité de stockage en tant que '' simple '' char objet .

Les caractères visés au 5.2.1 sont A-Z, a-z, 0 à 9, l'espace, tabulation, nouvelle ligne et les 29 caractères graphiques ci-dessous:

! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~ 

Réponse

Tous que j'interprète signifie essentiellement que les caractères ascii ayant une valeur inférieure à 128 sont garantis positifs. Donc, si les valeurs stockées sont toujours inférieure à 128, il doit être sûr (d'une valeur en préservant la perspective), mais pas si bonnes pratiques.

Autres conseils

Cela dépend compilateur. Par exemple, dans VC ++ il y a une option de compilation et une macro correspondante définie _CHAR_UNSIGNED si cette option indique à utiliser unsigned char par défaut.

Je suppose que vous parlez des champs de type signed char et unsigned char, ils sont donc explicitement faux. Si l'un d'entre eux était tout simplement char, il pourrait correspondre à ce que l'entrepreneur compilateur utilise (IIRC, il est défini par l'implémentation si char est signed ou unsigned), mais pas dans le vôtre. Dans ce cas, vous pourriez être en mesure d'obtenir avec une option de ligne de commande ou quelque chose à changer la vôtre.

Sinon, l'entrepreneur utilise peut-être un compilateur ou des options du compilateur, qui lui permettent de compiler tout en ignorant des erreurs ou des avertissements. Savez-vous quel type d'environnement de compilation qu'il a?

Dans tous les cas, ce n'est pas bon C. Si l'un des types est juste char, elle repose sur le comportement de l'implémentation, et est donc pas portable. Sinon, il est faux plat. Je prends cela avec l'entrepreneur.

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