9
votes

signification des valeurs négatives de type caractère en c

  1. Les caractères de 'C' sont utilisés pour représenter des caractères.
  2. Les numéros représentant des caractères dans toutes les pages de code sont toujours positifs.

    Quelle est l'utilisation d'avoir signé des caractères ?? Sont des valeurs négatives contenues dans des caractères utilisés uniquement comme des valeurs intégrales dans un type de données intégré plus petit que INT et court ?? N'ont-ils pas d'autre interprétation ?? (comme des valeurs positives en caractères représentant des caractères)


0 commentaires

8 Réponses :


12
votes

caractères dans 'c' sont utilisés pour représenter des 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.


6 commentaires

Si vous voulez dire qu'ils sont le seul type où la taille de (type) est garantie 1, oui. Ils ne sont pas garantis pour être 8 bits.


La seule chose qui raconte la taille d'un caractère, c'est que c'est 1. Cela ne dit pas quelles sont les unités de 1.


PDP-10, par exemple, d'octets de 9 bits utilisés.


Les normes C89 et C99 garantissent toutefois que le caractère de garantie est d'au moins 8 bits. Pourrait être plus, pourrait être signé ou non signé.


@David, oui L'utilisation principale de Char est d'avoir une taille de 1 octet lorsque vous expédiez des objets binaires autour. Le nombre de bits n'a pas d'importance.


@Davidthornley Ils sont garantis comme des bits Char_bit et Char_bit est un peu connu.



2
votes

de Page d'accueil de Jack Klein :

Char signé peut contenir toutes les valeurs de la plage de SCHAR_MIN à SCHAR_MAX, définie dans LIMITS.H. SCHAR_MIN doit être -127 ou moins (plus négatif) et Schar_max doit être de 127 ou plus. Notez que de nombreux compilateurs pour les processeurs qui utilisent une représentation complémentaire de 2 SCHAR_MIN de -128 de -128, mais cela n'est pas requis par les normes.

De ce que je peux dire, il n'y a pas de "sens" officiel de signé Char . Cependant, une chose à conscience est que tous les caractères ASCII normaux tombent dans la plage 0-127. Par conséquent, vous pouvez utiliser le type signé Char pour limiter les valeurs légales à la plage 0-127 et définir quelque chose de moins de 0 comme une erreur.

Par exemple, si j'avais une fonction qui recherche un texte ASCII et renvoie le caractère le plus fréquemment survenant, je pourrais peut-être définir une valeur de retour négative pour signifier qu'il y a deux caractères ou plus liés pour le plus fréquent. Ce n'est pas nécessairement un bon moyen de faire des choses, c'est juste un exemple du sommet de ma tête.


1 commentaires

Très simple, il existe 3 types de char : non signé Char , signé Char et Char . Les deux premiers sont explicites et utilisés pour manipuler le plus petit type de données numérique. Toutefois, Char est défini la mise en œuvre s'il est signé ou non signé. En résumé, lorsque le signe est important, ajoutez le qualificatif.



0
votes

dans les caractères C et C ++ peuvent être signés ou non signés. Une variable de caractère 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 avoir 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.


3 commentaires

NIT: '0' peut être 48. C'est un petit entier, capable de s'adapter à un Char , mais il n'est pas nécessaire de ne pas être 48.


Tu m'as eu. J'ai oublié d'Ebcdic. ;-)


Richard, il y a toujours la mort de la mort 9000 [ DialSpace.dial.pipex .Com / Prod / DialSpace / Town / Green / GFD34 / Art ] :)



4
votes

Les numéros représentant des caractères dans toutes les pages de code sont toujours positifs.

erm ... faux !?

de la norme C99, mettez l'accent sur la mine:

Si un membre de l'ensemble de caractères d'exécution de base est stocké dans un objet de caractère, sa valeur est garantie pour être positive.

Il n'est pas garanti que tous les caractères valides de toutes les pages de code sont positifs. Si Char est signé ou non signé est la mise en œuvre définie!


0 commentaires

5
votes

Seuls les caractères de l'ensemble de caractères d'exécution de base sont garantis pour être non négatifs (C99, 6.5.2 §3):

Un objet déclaré comme type Char est assez grand pour stocker n'importe quel membre de le jeu de caractères d'exécution de base. Si Un membre de l'exécution de base Le jeu de caractères est stocké dans un char objet, sa valeur est garantie d'être non négatif. Si un autre caractère est stocké dans un objet de caractère, le résultat résultant la valeur est définie par la mise en œuvre mais doit être dans la gamme de valeurs qui peut être représenté dans ce type.

Vous devez discerner entre le type "CODE" PLAIN ' CHAR et les types SIGNÉ Char et non signé Char aussi: Signé Char et Unsigné Char sont des types d'entiers ordinaires pour lesquels les détentements suivants (C99, 6.5.2 §5):

Un objet déclaré comme type signé Char occupe la même quantité de stockage que '' 'Un simple' '' objet de caractère.


1 commentaires

En outre, si Char est signé sur votre plate-forme et que vous lisez un caractère avec un point de code de code de code supérieur à char_max (dites un caractère comme æ dans ISO-8859-1, qui a CodePoint 0XE6 ), vous êtes assez susceptible d'obtenir une valeur de caractère négative.



0
votes

in c, un char (y compris signé Char et non signé Char ) est utilisé pour stocker un octet d'octet , que la norme C définit comme un petit nombre d'au moins 8 bits de taille.

ayant signé et non signé des octets est aussi utile que d'avoir des entiers plus importants. Si vous stockez un très grand nombre de petits nombres (0..255 pour non signé, -127..127 pour signé [1]) dans une matrice, vous préférez utiliser des octets pour eux plutôt que, dire, courts intenses , pour économiser de l'espace.

Historiquement, un octet et un personnage de texte étaient à peu près la même chose. Ensuite, quelqu'un réalisa qu'il y a plus de langues que l'anglais. Ces jours-ci, le texte est beaucoup plus compliqué, mais il est trop tard pour changer le nom du type char c.

[1] -128..127 pour les machines avec une représentation de deux compléments pour les nombres négatifs, mais la norme C ne garantit pas que.


1 commentaires

En fait, le terme der terme "octet" est défini nulle part. Dans C / C ++, les caractères sont des séquences de bits, de même que tout 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 mot-mot, mais pas la machine-octet. Char n'est même pas la plus petite unité de mémoire adressable. Par exemple, pour définir une utilisation struct char4 {non signée Int C: 4; }



2
votes

Méfiez-vous d'utiliser way em> caractères sous forme d'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++;
}


0 commentaires

1
votes

On vaut la peine de noter que le caractère est un type distinct de la Char et de la Char.


0 commentaires