Donc, je sais que la différence entre un int signé et non signé est qu'un bit est utilisé pour indiquer si le nombre est positif ou négatif, mais comment cela s'applique-t-il à un personnage? Comment un personnage peut-il être positif ou négatif?
Il n'y a pas de "type de caractère" dédié en langage C. char
est un type entier, identique (à cet égard) à int
, short
et à d'autres types entiers. char
s'avère être le plus petit type entier. Donc, comme tout autre type d’entier, il peut être signé ou non signé.
Il est vrai que (comme son nom l'indique), char
est principalement destiné à être utilisé pour représenter des caractères. Mais les caractères en C sont représentés par leurs "codes" entiers, il n’ya donc rien d’inhabituel dans le fait qu’un type entier char
est utilisé à cette fin.
La seule différence générale entre char
et d'autres types entiers est que plain char
n'est généralement pas synonyme de signed char
, tandis que pour d'autres types entiers, le modificateur signed
est optionnel/implicite.
Je suis légèrement en désaccord avec ce qui précède. Le caractère nsigned char signifie simplement: utilisez le bit le plus significatif au lieu de le traiter comme un indicateur de bit pour le signe +/- lors de l'exécution d'opérations arithmétiques.
Cela prend une signification si vous utilisez char sous forme de nombre, par exemple:
typedef char BYTE1;
typedef unsigned char BYTE2;
BYTE1 a;
BYTE2 b;
Pour la variable a, seuls 7 bits sont disponibles et sa plage est comprise entre (-127 et 127) = (+/-) 2 ^ 7 -1. Pour la variable b, tous les 8 bits sont disponibles et la plage est comprise entre 0 et 255 (2 ^ 8 -1).
Si vous utilisez char comme caractère, "unsigned" est complètement ignoré par le compilateur, tout comme les commentaires sont supprimés de votre programme.
Il existe trois types de caractères: (brut) char
, signed char
et unsigned char
. Tout caractère est généralement un entier de 8 bits * et dans ce sens, un signed
et unsigned char
ont une signification utile (généralement équivalent à uint8_t
et int8_t
). Lorsqu'il est utilisé comme un caractère au sens de texte, utilisez un char
(également appelé caractère brut). Ceci est typiquement un signed char
mais peut être implémenté dans les deux sens par le compilateur.
* Techniquement, un caractère peut avoir n'importe quelle taille tant que sizeof(char)
vaut 1, mais il s'agit généralement d'un entier de 8 bits.
La représentation est la même, le sens est différent. Par exemple, 0xFF, il est représenté par "FF". Lorsqu'il est traité comme "char", il est négatif numéro -1; mais c'est 255 comme non signé. En ce qui concerne le décalage de bits, la différence est grande car le bit de signe n'est pas décalé. Par exemple, si vous décalez de 255 bits vers la droite d'un bit, vous obtiendrez 127; décaler "-1" à droite n'aura aucun effet.
Un "caractère signé" est une valeur signée qui est généralement inférieure à un "court", et ne doit pas être supérieure à celle-ci. Un "caractère non signé" est une valeur non signée qui est généralement inférieure à un "court" et dont la garantie de ne pas être supérieure à celle-ci est garantie. Un type 'char' sans qualificateur signé ou non signé peut se comporter comme un caractère signé ou non signé; ceci est généralement défini par la mise en œuvre, mais il y a quelques cas où ce n'est pas le cas:
Une partie de la raison pour laquelle il existe deux dialectes de "C" (ceux où "char" est signé, et ceux où il est non signé) est qu'il existe certaines implémentations où "char" doit être non signé, et d'autres où il doit être signé.
Ceci parce qu'un char
est stocké à tous les effets sous forme de nombre à 8 bits. Parler d'un char
négatif ou positif n'a pas de sens si vous le considérez comme un code ASCII (qui peut être simplement signé *), mais est logique si vous utilisez ce char
à stocker un nombre, qui peut être compris entre 0 et 255 ou -128..127 selon la représentation à 2 complément.
*: cela peut aussi être non signé, cela dépend en fait de l'implémentation je pense, dans ce cas vous aurez accès au charset étendu ASCII fourni par l'encodage utilisé
De la même manière, une int
peut être positive ou négative. Il n'y a pas de différence. En fait, sur de nombreuses plates-formes non qualifiées, char
est signé.
De la même manière - par exemple si vous avez un caractère de 8 bits, 7 bits peuvent être utilisés pour la magnitude et 1 pour le signe. Ainsi, un caractère non signé peut aller de 0 à 255, tandis qu'un caractère signé peut aller de -128 à 127 (par exemple).