2009-12-21 6 views
5
  1. Les caractères de 'C' sont utilisés pour représenter les caractères.
  2. Les nombres représentant des caractères dans toutes les pages de codes sont toujours positifs.

À quoi cela sert-il d'avoir des caractères signés? Les valeurs négatives contenues dans les caractères sont-elles uniquement utilisées comme valeurs intégrales dans un type de données intégral plus petit que int et court? N'ont-ils pas d'autre interprétation? (Comme des valeurs positives dans des caractères représentant des caractères)Signification des valeurs négatives de type char dans C

Répondre

11

Les caractères dans 'C' sont utilisés pour représenter les caractères.

Pas toujours, les caractères sont utilisés pour représenter des octets, ils sont le seul type en c avec une taille connue.

+12

Si vous voulez dire qu'ils sont le seul type où sizeof (type) est garanti à 1, oui. Ils ne sont pas garantis d'être 8 bits. –

+2

La seule chose que C dit sur la taille d'un caractère est qu'il est 1. Il ne dit pas ce que sont les unités de 1. –

+1

Par exemple, PDP-10 utilisait des octets de 9 bits. –

2

De Jack Klein's Home Page:

signed char peut contenir toutes les valeurs dans la gamme de SCHAR_MIN à SCHAR_MAX, défini dans limits.h. SCHAR_MIN doit être égal ou inférieur à -127 (plus négatif) et SCHAR_MAX doit être supérieur ou égal à 127. Notez que de nombreux compilateurs pour les processeurs qui utilisent une représentation en complément à 2 prennent en charge SCHAR_MIN de -128, mais cela n'est pas requis par les normes.

D'après ce que je peux dire, il n'y a pas de "signification" officielle de signed char. Cependant, une chose à savoir est que tous les caractères ASCII normaux tombent dans la gamme 0-127. Par conséquent, vous pouvez utiliser le type signed char pour limiter les valeurs légales à la plage 0-127 et définir tout ce qui est inférieur à 0 en tant qu'erreur. Par exemple, si j'avais une fonction qui recherche du texte ASCII et renvoie le caractère le plus fréquemment rencontré, je pourrais peut-être définir une valeur de retour négative pour indiquer qu'il y a deux ou plusieurs caractères ex aequo pour le plus fréquent. Ce n'est pas forcément un bon moyen de faire les choses, c'est juste un exemple de la tête.

+1

Très simple, il y a 3 types de 'char':' unsigned char', 'signed char' et' char'. Les deux premiers sont explicites et utilisés pour manipuler le plus petit type de données numériques. Cependant, 'char', est l'implémentation définie si elle est signée ou non signée. En résumé, lorsque le signe est significatif, ajoutez le qualificatif. –

0

Les caractères C et C++ peuvent être signés ou non. Une variable char peut être utilisée pour contenir une petite valeur entière. Ceci est utile pour plusieurs raisons:

  • Sur de petites machines, par ex. un micro 8 bits. Cela pourrait permettre un accès et une manipulation plus efficaces.
  • Si vous souhaitez disposer d'un grand nombre de petites valeurs, disons 100K, vous pouvez enregistrer un tas de mémoire en utilisant un tableau de caractères plutôt que. par exemple. ints.

En C, un littéral de caractère est une constante entière. '0' est égal à 48.

+0

Nit: '' 0 '' peut ou peut ne pas être 48. C'est un petit nombre entier, capable de tenir dans un 'char', mais il n'a pas besoin d'être 48. –

+0

Vous m'avez. J'ai oublié EBCDIC. ;-) –

+1

Richard, il y a toujours la DeathStation 9000 [http://dialspace.dial.pipex.com/prod/dialspace/town/green/gfd34/art/] :) – pmg

4

Les nombres représentant des caractères dans toutes les pages de codes sont toujours positifs.

Erm ... erroné!?

de la norme C99, Souligné par l'auteur:

Si un membre du caractère d'exécution de base est défini stocké dans un objet char, sa valeur est garantie à être positive.

Il n'est pas garanti que tous les caractères valides de toutes les pages de codes sont positifs. Si char est signé ou non signé, l'implémentation est définie!

4

Seuls les caractères du jeu de caractères d'exécution de base sont garantis non négatif (C99, 6.5.2 §3):

Un objet déclaré comme type char est assez grand pour stocker tout membre de la jeu de caractères d'exécution de base. Si un membre de l'ensemble exécution de base de caractères est stocké dans un objet charbon , sa valeur est garantie non négatif. Si un autre caractère est stocké dans un objet char, la valeur résultante est définie par l'implémentation, mais sont dans la plage des valeurs qui peuvent être représentées dans ce type.

Vous devez discerner entre le type 'plaine' char et les types signed char et unsigned char ainsi: signed char et unsigned char sont les types entiers ordinaires pour lesquels les conditions suivantes est remplie (C99, 6.5.2 §5):

un objet déclaré que le type signed char occupe la même quantité de stockage en tant que « » ordinaire « » objet char.

+0

En outre, si 'char' est signé sur votre plate-forme et vous lisez un caractère avec un codepoint supérieur à 'CHAR_MAX' (disons un caractère comme æ dans ISO-8859-1, qui a le codepoint' 0xE6'), vous êtes susceptible d'obtenir une valeur de caractère négatif. – caf

0

En C, un char (y compris signed char et unsigned char) est utilisé pour stocker un octet , que la norme C définit comme un petit nombre entier au moins 8 bits en taille.

Ayant signé et octets non signés est aussi utile que d'avoir des entiers plus grands. Si vous stockez un très grand nombre de petits nombres (0..255 pour unsigned, -127..127 pour signed [1]) dans un tableau, vous préférerez peut-être utiliser des octets plutôt que, disons, des petits nombres , pour économiser de l'espace.

Historiquement, un octet et un caractère de texte ont été à peu près la même chose. Puis quelqu'un s'est rendu compte qu'il y a plus de langues que d'anglais. Ces jours-ci, le texte est beaucoup plus compliqué, mais il est trop tard pour changer le nom du type char en C.

[1] -128..127 pour les machines avec la représentation du complément à deux pour les nombres négatifs, mais le C la norme ne le garantit pas.

+0

En fait, der term "octet" n'est défini nulle part. En C/C++, les caractères sont des séquences de bits, tout comme n'importe quel objet. Mais 'int' est" la taille naturelle suggérée par l'architecture de l'environnement d'exécution "(C++ 11 §3.9.1/2). La norme peut donc définir le terme machine-mot, mais pas machine-byte. 'char' n'est même pas la plus petite unité de mémoire adressable. Par exemple, pour définir un char à 4 bits, utilisez 'struct char4 {unsigned int c: 4; } ' –

2

Méfiez-vous simplement d'utiliser caractères simples comme index de tableau.

char buf[10000]; 
fgets(buf, sizeof buf, stdin); 
unsigned charcount[UCHAR_MAX] = {0}; 
char *p = buf; 
while (*p) { 
    charcount[*p]++; /* if (*p < 0) BOOM! */ 
    // charcount[(unsigned char)*p]++; 
    p++; 
} 
1

Il convient de noter que l'omble est un type distinct à la fois signed char et unsigned char.

Questions connexes