Qu'est ce qu'un unsigned char?

en c/" class="blnk">C/C++, à quoi sert un unsigned char ? En quoi est-ce différent d'un char régulier ?

405
demandé sur Kirill Kobelev 2008-09-16 22:05:18

17 réponses

en C++, il y a trois distincts types de caractères:

  • char
  • signed char
  • unsigned char

si vous utilisez des types de caractères pour texte , utilisez le non qualifié char :

  • c'est le type de caractères littéraux comme 'a' ou '0' .
  • c'est le type qui compose les cordes C comme "abcde"

il s'agit également d'une valeur numérique, mais il n'est pas précisé si cette valeur est traitée comme signée ou non. Méfiez - vous des comparaisons de caractères à travers les inégalités-bien que si vous vous limitez à ASCII (0-127) vous êtes juste sur le point de sécurité.

si vous utilisez des types de caractères comme nombres , utilisez:

  • signed char , ce qui vous donne au moins la gamme de -127 à 127. (-128 à 127 est commun)
  • unsigned char , qui vous donne au moins la gamme 0 à 255.

"au moins", parce que la norme C++ ne donne que la plage minimale de valeurs que chaque type numérique doit couvrir. sizeof (char) est requis pour être 1( i.e. un octet), mais un octet pourrait en théorie par exemple 32 bits. sizeof serait toujours déclarée comme 1 - ce qui signifie que vous pourrait avoir sizeof (char) == sizeof (long) == 1 .

491
répondu Fruny 2014-10-24 03:42:23

cela dépend de la mise en œuvre, car la norme C ne définit pas la signature de char . Selon la plateforme, char peut être signed ou unsigned , vous devez donc demander explicitement signed char ou unsigned char si votre implémentation en dépend. Il suffit d'utiliser char si vous avez l'intention de représenter des caractères à partir de chaînes, car cela correspondra à ce que votre plate-forme met dans la chaîne.

la différence entre signed char et unsigned char , c'est normal. Sur la plupart des plates-formes, signed char sera un numéro de complément de 8-bit two allant de -128 à 127 , et unsigned char sera un entier 8-bit non signé ( 0 à 255 ). Note la norme n'exige pas que les types char aient 8 bits, mais seulement que sizeof(char) retourne 1 . Vous pouvez obtenir le nombre de bits dans un char avec CHAR_BIT dans limits.h . Il y a peu ou pas de plates-formes aujourd'hui où ce sera autre chose que 8 , cependant.

il y a un résumé agréable de ce numéro ici .

comme d'autres l'ont mentionné depuis que j'ai posté ceci, vous êtes mieux en utilisant int8_t et uint8_t si vous voulez vraiment représenter de petits entiers.

78
répondu tgamblin 2014-12-02 17:57:55

Parce que je sens que c'est vraiment, je veux juste de l'état de certaines règles de C et C++ (ils sont identiques). Tout d'abord, tous les bits de unsigned char participer à la détermination de la valeur si un objet char non signé. Deuxièmement, unsigned char est explicitement indiqué sans signature.

maintenant, j'ai eu une discussion avec quelqu'un sur ce qui se passe quand vous convertissez la valeur -1 de type int en unsigned char . Il a refusé l'idée que le résultat unsigned char a tous ses bits mis à 1, parce qu'il était inquiet de la représentation de signe. Mais il ne faut pas. Il découle immédiatement de cette règle que la conversion fait ce qui est prévu:

si le nouveau type n'est pas signé, la valeur est convertie par addition répétée ou soustraire une valeur de plus que la valeur maximale qui peut être représentée dans le nouveau type jusqu'à ce que la valeur soit dans la gamme du nouveau type. ( 6.3.1.3p2 dans un C99 projet)

c'est une description mathématique. C++ le décrit en termes de calcul de modulo, qui cède à la même règle. Quoi qu'il en soit, ce qui est pas garanti est que tous les bits dans le nombre entier -1 sont un avant la conversion. Alors, qu'est-ce qu'on a pour pouvoir prétendre que le unsigned char qui en résulte a tous ses CHAR_BIT bits tournés à 1?

  1. tous les bits participent à la détermination de son valeur-c'est-à-dire qu'il n'y a pas de bits de remplissage dans l'objet.
  2. L'ajout d'une seule fois UCHAR_MAX+1 à -1 donnera une valeur dans la gamme, à savoir UCHAR_MAX

ça suffit, en fait! Donc chaque fois que vous voulez avoir un unsigned char ayant tous ses bits un, vous faites

unsigned char c = (unsigned char)-1;

il s'ensuit également qu'une conversion est et non simplement tronquer des bits d'ordre supérieur. La chance événement pour complément de deux est qu'il est juste une troncation là, mais la même chose n'est pas nécessairement vraie pour d'autres représentations de signe.

35
répondu Johannes Schaub - litb 2009-01-14 11:30:11

comme par exemple les usages de non signé char :

unsigend char est souvent utilisé en infographie qui très souvent (mais pas toujours) assigne un seul octet à chaque composante de couleur. Il est courant de voir une couleur RGB (ou RGBA) représentée par 24 (ou 32) bits, chacun étant un char non signé . Comme les valeurs de non signée char tombent dans la gamme [0,255], les valeurs sont typiquement interprété comme

  • 0 signifiant l'absence totale d'un composant de couleur donné
  • 255 signifiant 100% d'un pigment de couleur donné

ainsi vous finiriez avec le rouge RVB comme (255,0,0) -> (100% rouge, 0% Vert, 0% Bleu).

pourquoi ne pas utiliser un char signé ? L'arithmétique et le décalage de bits devient problématique. Comme déjà expliqué, un signé char 's la portée est essentiellement décalée de -128. Une méthode très simple et naïve (la plupart du temps non utilisée) pour convertir RVB en échelle de gris consiste à faire la moyenne des trois composantes de couleur, mais cela pose des problèmes lorsque les valeurs des composantes de couleur sont négatives. Rouge (255, 0, 0) moyennes à (85, 85, 85) lorsqu'on utilise char non signé arithmétique. Cependant, si les valeurs étaient char signé s (127, -128, -128), nous nous retrouverions avec (-99, -99, -99), ce qui serait (29, 29, 29) dans notre espace non signé char , ce qui est incorrect.

22
répondu Zachary Garrett 2008-09-17 02:44:42

si vous voulez utiliser un caractère comme un petit entier, la façon la plus sûre de le faire est avec les types int8_t et uint8_t .

12
répondu jbleners 2013-08-16 12:31:51

char et unsigned char ne sont pas garantis pour être des types 8 bits sur toutes les plateformes-ils sont garantis pour être 8 bits ou plus. Certaines plates-formes ont 9-bit, 32-bit ou 64-bits octets . Cependant, les plates-formes les plus courantes aujourd'hui (Windows, Mac, Linux x86, etc.) ont octets de 8 bits.

5
répondu bk1e 2008-09-17 05:49:54

signed char a une portée de -128 à 127; unsigned char a une portée de 0 à 255.

char sera équivalent à char signé ou non signé, selon le compilateur, mais est un type distinct.

si vous utilisez des cordes de style C, utilisez char . Si vous avez besoin d'utiliser des caractères pour l'arithmétique (assez rare), spécifier signé ou non signé explicitement pour la portabilité.

5
répondu James Hopkin 2015-12-07 15:09:56

unsigned char ne prend que des valeurs positives....comme 0 à 255

signed char prend à la fois des valeurs positives et négatives....comme -128 pour +127

4
répondu munna 2014-11-28 11:50:49

un caractère non signé est une valeur de byte (non signé) (0 à 255). Vous pensez peut-être de "char" en termes de "personnage", mais c'est vraiment une valeur numérique. Le "char" régulier est signé, donc vous avez 128 valeurs, et ces valeurs correspondent aux caractères en utilisant l'encodage ASCII. Mais dans les deux cas, ce que vous stockez en mémoire est une valeur d'un octet.

3
répondu Zac Gochenour 2008-09-16 18:16:34

en termes de valeurs directes, on utilise un caractère régulier lorsque les valeurs se situent entre CHAR_MIN et CHAR_MAX , alors qu'un caractère non signé fournit le double de l'intervalle sur l'extrémité positive. Par exemple, si CHAR_BIT est 8, la fourchette de la normale char est seulement garantie à être [0, 127] (parce qu'il peut être signé ou non) tandis que unsigned char sera [0, 255] et signed char sera [-127, 127].

En termes de ce qu'il est utilisé pour les normes permettre aux objets de POD (vieilles données) d'être directement convertis en un tableau de char non signé. Cela vous permet d'examiner la représentation et modèles de bits de l'objet. La même garantie de poinçonnage de type sûr n'existe pas pour char ou char signé.

3
répondu Julienne Walker 2013-08-16 12:32:27

si vous aimez utiliser différents types de longueur spécifique et de signification, Vous êtes probablement mieux avec uint8_t, int8_t, uint16_t, etc simplement parce qu'ils font exactement ce qu'ils disent.

2
répondu Dark Shikari 2008-09-16 18:18:46

char non signé est le cœur de la ruse. Dans presque tous les compilateurs pour toute la plate-forme un char non signé est simplement un octet. Un entier non signé de (Habituellement) 8 bits. cela peut être traité comme un petit entier ou un paquet de bits.

dans addiction, comme quelqu'un d'autre l'a dit, la norme ne définit pas le signe d'un char. donc vous avez 3 types de "char" distincts: char, char signé, char non signé.

2
répondu ugasoft 2008-09-16 19:14:19

les numéros non signés sont always positive or zero , et obéissent au laws of arithmetic modulo 2^n , où n est le nombre de bits dans le type .

exemple : si les caractères sont 8 bits , unsigned char les variables ont des valeurs entre 0 and 255 , tandis que signed chars ont des valeurs entre -128 and 127.

2
répondu Prateek Joshi 2015-10-13 08:13:27

certains googling trouvé ce , où les gens ont eu une discussion à ce sujet.

un char non signé est essentiellement un octet simple. Ainsi, vous souhaitez utiliser si vous avez besoin d'un octet de données (par exemple, peut-être que vous voulez l'utiliser pour définir des indicateurs sur et en dehors d'être transmis à une fonction, comme c'est souvent fait dans l'API Windows).

1
répondu dbrien 2008-09-16 18:16:27

un char non signé utilise le bit qui est réservé au signe d'un char régulier comme un autre nombre. Cela change la plage à [0-255] par opposition à [-128 - 127].

en général, les caractères non signés sont utilisés lorsque vous ne voulez pas de signe. Cela fera une différence quand on fait des choses comme déplacer des bits (shift étend le signe) et d'autres choses quand on traite un char comme un octet plutôt que de l'utiliser comme un nombre.

0
répondu 2008-09-16 18:20:27

cité frome "la programmation en c laugage" livre:

le qualificatif signed ou unsigned peut être appliqué au caractère ou à tout entier. les nombres non signés sont toujours positifs ou zéro, et obéissent aux lois du modulo arithmétique 2^N, où n est le nombre de bits dans le type. Ainsi, par exemple, si les caractères sont 8 bits, les variables char non signées ont des valeurs entre 0 et 255, tandis que les caractères signés ont des valeurs entre -128 et 127 (dans un deux' s en complément de la machine.) Que ce soit clair les RCA sont signées ou non et dépendent de la machine, mais les caractères imprimables sont toujours positives.

0
répondu ZhaoGang 2017-07-21 03:27:53

non signé char ne prend que des valeurs positives: 0 à 255 char signé prend des valeurs positives et négatives: -128 à + 127

0
répondu NL628 2017-11-24 22:40:44