J'ai récemment lu que les différences entre et p> sont spécifiques à la plate-forme. Fondamentalement ma question vient de voir cette ligne: p> Je ne comprends pas la pertinence de la signalisation? P > p>
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? P>
6 Réponses :
Il est plus correct de dire que c'est spécifique au compilateur et que vous ne devriez pas compter sur Sinon, vous feriez face au problème suivant: vous écrivez et déboguez le programme en supposant que char code> être signé ou non signé lors de l'utilisation de
Char code> sans un
signé code > ou
non signé code> qualificatif. p>
Char code> 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. P>
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.
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. P>
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.
Peut-être que vous parlez du fait que la signature de Char code> est compilateur / plate-forme spécifique. Voici une entrée de blog qui enfonce une lumière dessus: p>
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 code> et autres
signé Char code> comme
Char code>
Un caractère signé est toujours 8 bit et a toujours le bit signé comme le dernier bit. p>
Un caractère non signé est toujours 8 bit et n'a pas de piqué de signalisation. P>
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. P>
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.
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: pour les types d'int est contraire, vous ne pouvez pas avoir p>
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
Supposons que votre plate-forme a des octets huit bits et supposons que nous ayons le modèle de bit maintenant pour 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 Utiliser Étant donné que vous êtes peu susceptible de faire des arithmétiques généraux sur des caractères, il ne comportera pas si 10101010 code>. À un
signé Char code>, cette valeur est -86. Pour
non signé Char CODE>, 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. P>
Char code>. La norme ne dit pas laquelle de ces deux interprétations devrait être correcte. Un
char code> détenant le motif de bits
10101010 code> pourrait être soit em> -86 ou em> 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. P>
SHLEN code> avec un
signé Char * code> ou un
sans signé Char * code>; Cela ne fonctionnera pas. P>
signé Char code> Lorsque vous souhaitez un type numérique signé à une octet et utilisez
sans signé Char code> lorsque vous souhaitez un type numérique non signé à une octet. Utilisez un ancien
char code> 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 code>. p>
Char code> est signé ou non signé sur l'une des plates-formes et des compilateurs que vous utilisez. P>
C'est l'explication que je cherchais! +1 et un grand merci!