web-dev-qa-db-fra.com

Différence entre les caractères signés / non signés

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?

128
Chiggins

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.

120
AnT

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.

39
Simple Fellow

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.

21
DrAl

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.

14
user2376256

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:

  1. Si, dans le jeu de caractères de la plate-forme cible, l'un des caractères requis par la norme C mapperait vers un code supérieur au maximum du caractère signé, alors 'caractère' doit être non signé.
  2. Si 'char' et 'short' ont la même taille, alors 'char' doit être signé.

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é.

10
supercat

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é

2
Jack

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é.

1
Let_Me_Be

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).

1
Stuart Golodetz