pourquoi la signature de char n’est-elle pas définie en C?

La norme C stipule:

ISO / IEC 9899: 1999, 6.2.5.15 (p. 49)

Les trois types char, char signé et non signé sont collectivement appelés types de caractères. L’implémentation doit définir char pour avoir la même plage, la même représentation et le même comportement que char signé ou non signé.

Et en effet, gcc définit cela en fonction de la plate-forme cible.

Ma question est la suivante: pourquoi la norme fait-elle cela? Je ne vois rien qui puisse sortir d’une définition de type ambiguë, à l’exception de bogues hideux et difficiles à repérer.

De plus, dans ANSI C (avant C99), le seul type d’octet est char, il est donc parfois inévitable d’utiliser char pour les mathématiques. Donc, dire “on ne devrait jamais utiliser des caractères pour les mathématiques” n’est pas si vrai. Si tel était le cas, une décision plus judicieuse consistait à inclure trois types ” char , ubyte , sbyte “.

Y a-t-il une raison à cela, ou s’agit-il simplement d’une étrange compatibilité ascendante, afin de permettre aux mauvais compilateurs (mais communs) d’être définis comme compatibles standard?

Un caractère “ordinaire” avec une signature non spécifiée permet aux compilateurs de sélectionner la représentation la plus efficace pour l’architecture cible: sur certaines architectures, l’extension zéro d’une valeur d’un octet à la taille de “int” nécessite moins d’opérations unsigned ‘), tandis que sur d’autres, le jeu d’instructions rend l’extension du signe plus naturel, et le caractère brut est implémenté comme indiqué.

Peut-être qu’historiquement, certaines “implémentations” de chars étaient signées et d’autres non signées. Par conséquent, pour être compatibles avec les deux, ils ne pouvaient pas le définir comme étant l’un ou l’autre.

dans ce bon vieux temps, C était défini, le monde des personnages était de 7 bits, ainsi le bit de signe pouvait être utilisé pour autre chose (comme EOF)

Sur certaines machines, un caractère signé serait trop petit pour contenir tous les caractères du jeu de caractères C (lettres, chiffres, signes de ponctuation standard, etc.). Sur ces machines, le caractère ‘doit être non signé. Sur d’autres machines, un caractère non signé peut contenir des valeurs supérieures à un entier signé (puisque char et int ont la même taille). Sur ces machines, ‘char’ doit être signé.

Je suppose (de mémoire) que leur pensée allait dans le sens suivant:

Si vous vous souciez du signe de caractère (l’utiliser comme octet), vous devez explicitement choisir un caractère signé ou non signé.