12
votes

Quelqu'un peut-il expliquer comment la souci de la plate-forme est spécifique à la plate-forme?

J'ai récemment lu que les différences entre xxx

et xxx

sont spécifiques à la plate-forme.
Je ne peux pas vraiment me mettre la tête autour de moi? Cela signifie-t-il que la séquence de bits peut varier d'une plate-forme à la plate-forme suivante IE1 Le panneau est le premier bit, plate-forme2 Le signe pourrait être à la fin? Comment voudriez-vous coder cela?

Fondamentalement ma question vient de voir cette ligne: xxx

Je ne comprends pas la pertinence de la signalisation?


0 commentaires

6 Réponses :


3
votes

Il est plus correct de dire que c'est spécifique au compilateur et que vous ne devriez pas compter sur char être signé ou non signé lors de l'utilisation de Char sans un signé ou non signé qualificatif.

Sinon, vous feriez face au problème suivant: vous écrivez et déboguez le programme en supposant que Char est signé par défaut puis il est recompanté avec un compilateur en supposant autrement et le comportement du programme change de manière drastique. Si vous dépendez de cette hypothèse de cette hypothèse de temps en temps dans votre code, vous risquez de faire face au comportement involontaire dans certains cas qui ne sont déclenchés que dans votre programme dans des conditions spécifiques et sont très difficiles à détecter et à déboguer.


2 commentaires

Voici un exemple de comportement surprenant: Stackoverflow.com/Questtions/1097130/...


Un problème classique se produit avec le turc Y-Umlaut (ÿ, Unicode U + 00FF) dans l'ISO 8859-1, code de caractères 255. Si le livre est signé, il peut être confondu avec EOF, qui est normalement -1.



0
votes

Avoir un caractère signé est plus un coup de chance de la manière dont tous les types de variable de base sont traités en C, il n'est généralement pas utile d'avoir des caractères négatifs.


9 commentaires

Beaucoup de gens diraient «généralement qu'il n'est pas utile d'avoir des caractères non signés», c'est pourquoi la signature de Char diffère entre des implémentations.


C'est ce que je ne comprends pas, les caractères sûrement soussignés sont plus utiles puis signés?


Et vous avez réellement attribué une valeur négative à un caractère, un support de caractère large et similaire est plus important maintenant que des caractères ayant des valeurs négatives.


@Adam, peu importe quand on n'a pas suffisamment de caractères pour remplir chaque byte dans ANSI C / ISO C ++ (ensemble de caractères ASCII), d'où le bit de signalisation est plus là pour une bonne mesure.


@William Pursell: Je n'ai jamais eu l'impression que la signature de la signature était utile, alors que les avoir non signés rendent beaucoup de caractère (texte) plus simple.


@Jonathan Leffler: Il y a une situation où la souci de la snovéness d'une camarade d'un non donnée 'est requise: quand "char" et "int' ont la même taille. Toutes les machines utilisent pas C ont des octets de 8 bits; J'ai écrit C code C pour une plate-forme avec des octets de 16 bits et des entiers 16 bits. La norme nécessite qu'un "INT" signé soit en mesure de contenir toutes les valeurs pouvant être détenues par un "caractère". Si "Char" était non signé 16 bits et "INT" ont été signés de 16 bits, cette exigence serait violée.


@supercat: Depuis que EOF doit être un INT négatif et doit être distinct de tous les caractères valides, et comme des fonctions telles que Fgec () renvoient le caractère comme un caractère non signé converti en Int, je pense que votre environnement avec un char et 16 bits Entier présente des problèmes inhabituels au bord de la définition du langage C. Vous pouvez vous échapper à Unicode: U + FFFF n'est pas un caractère unicode valide. Mais ça devient difficile. Il est intéressant de savoir qu'il existe de telles plateformes - pouvez-vous l'identifier? Est-ce un système informatique intégré?


@Jonathan Leffler: J'ai écrit une pile TCP sur "Métal nu" sur un Ti DSP, où la taille de (int) == taille de (char) == 16 bits. Je n'ai utilisé aucune routines d'E / S de bibliothèque; Mes routines TCP utilisent les 8 bits inférieurs de chaque octet, donc -1 fonctionne bien en tant qu'indicateur EOF. Certaines autres routines telles que mon système de fichiers flash utilisent des octets 16 bits, mais chaque fichier dispose d'un drapeau Lecture-EOF.


@Jonathan Leffler: Incidemment, il convient de noter que même dans des machines avec des octets de 8 bits, toutes les valeurs d'octets ne sont pas nécessairement légales dans des fichiers texte. Sur de nombreuses implémentations MS-DOS, par exemple, un personnage 0x1a dans un fichier texte sera considéré comme EOF et quelque chose de passé qui sera ignoré. Il serait donc parfaitement plausible pour un système avec un type de «caractère» de 16 bits signé à intervenir -1 dans un fichier texte.



2
votes

Peut-être que vous parlez du fait que la signature de Char est compilateur / plate-forme spécifique. Voici une entrée de blog qui enfonce une lumière dessus:

Types de caractères en C et C ++


2 commentaires

Je pense que c'est ce que je lis réellement! J'ai ajouté à ma question


Qui répond à ma question à ma question à: Pourquoi certaines plates-formes ont non signé Char et autres signé Char comme Char



-6
votes

Un caractère signé est toujours 8 bit et a toujours le bit signé comme le dernier bit.

Un caractère non signé est toujours 8 bit et n'a pas de piqué de signalisation.

Un caractère est aussi loin que je sais toujours non signé. Tout compilateur de défaillance d'un caractère signé sera confronté à de nombreux programmes incompatibles.


4 commentaires

Un caractère n'est pas toujours 8 bits. Historiquement, c'était souvent 9. À l'heure actuelle, il est souvent 16 ou 32. Le nombre de bits dans un caractère est char_bit, qui est en fonction de la mise en œuvre.


Je ne crois pas que ceci est correct ... Parashift. com / c ++ - FAQ-Lite / intrinsèque-type.html # FAQ-26.4 indique clairement que char == 1 octet et 1 octet == au moins 8 bit?


GCC, MSVC de défaut reconnaît le caractère signé.


Yossarian, pour GCC, la valeur par défaut dépend de la plate-forme de fonctionnement.



18
votes

Vous avez mal compris quelque chose. Le caractère signé est toujours signé. Un espace non signé est toujours non signé. Mais si un caractère ordinaire est signé ou non signé, la mise en œuvre est spécifique - cela signifie que cela dépend de votre compilateur. Cela fait la différence entre les types d'int, qui sont tous signés (INT est identique à SIGNT INT, court est le même que celui signé court). Une chose plus intéressante est que le char, le caractère signé et le caractère non signé sont traités comme trois types distincts en termes de surcharge de fonction. Cela signifie que vous pouvez avoir dans la même unité de compilation trois surcharges de fonction: xxx

pour les types d'int est contraire, vous ne pouvez pas avoir xxx < p> Parce que Int et signé INT est la même.


4 commentaires

Je pense que cela clarifie considérablement mais je voudrais plus de commentaires avant d'accepter la réponse


Re 'Int est la même chose que celle signée INT' etc .: Sauf si vous l'utilisez comme type d'un bitfield!


+1 Très bonne réponse et en apprenant beaucoup. Il ne faut-il pas que l'un des caractères signés ou non signé sur une plate-forme unique? Dans ce cas, comment la surcharge peut-elle fonctionner?


aurait dû être "Comment fonctionne la surcharge?". Mais il suffit de lire à nouveau la réponse de Tkopec et il est clairement mentionné qu'ils sont traités comme des types distincts. Ma faute



19
votes

Supposons que votre plate-forme a des octets huit bits et supposons que nous ayons le modèle de bit 10101010 . À un signé Char , cette valeur est -86. Pour non signé Char , cependant, ce même motif de bits représente 170. Nous n'avons déplacé aucune bite; Ce sont les mêmes bits, interprété deux manières différentes.

maintenant pour Char . La norme ne dit pas laquelle de ces deux interprétations devrait être correcte. Un char détenant le motif de bits 10101010 pourrait être soit -86 ou 170. Cela va être l'une de ces Deux valeurs, mais vous devez connaître le compilateur et la plate-forme avant de pouvoir prédire lequel ce sera. Certains compilateurs offrent un commutateur de ligne de commande pour contrôler lequel ce sera. Certains compilateurs ont des valeurs par défaut différentes en fonction du système d'exploitation qu'ils utilisent, afin qu'ils puissent correspondre à la convention du système d'exploitation.

Dans la plupart des codes, cela ne devrait vraiment pas avoir d'importance. Ils sont traités comme trois types distincts, aux fins de surcharge. Les pointeurs à l'un de ces types ne sont pas compatibles avec des pointeurs à un autre type. Essayez appeler SHLEN avec un signé Char * ou un sans signé Char * ; Cela ne fonctionnera pas.

Utiliser signé Char Lorsque vous souhaitez un type numérique signé à une octet et utilisez sans signé Char lorsque vous souhaitez un type numérique non signé à une octet. Utilisez un ancien char lorsque vous souhaitez conserver des caractères. C'est ce que le programmeur pensait lors de la rédaction de la typée, vous demandez. Le nom "octet" n'a pas la connotation de la saisie de données de caractères, alors que le nom "non signé Char" a le mot "caractère" dans son nom et que certaines personnes pensent que c'est un bon type pour tenir des caractères, ou que C'est une bonne idée de le comparer avec des variables de type char .

Étant donné que vous êtes peu susceptible de faire des arithmétiques généraux sur des caractères, il ne comportera pas si Char est signé ou non signé sur l'une des plates-formes et des compilateurs que vous utilisez.


1 commentaires

C'est l'explication que je cherchais! +1 et un grand merci!