Convertir char en int en C et C++
Comment puis-je convertir un char
à un int
en C et C++?
- ce serait une bonne idée d'être plus concret. une question sur une généralisation invite généralisée des réponses qui ne sont pas applicables ou même correcte pour votre tâche. gardez à l'esprit, lorsque vous demandez, vous ne savez probablement pas assez pour généraliser correctement.
- P. Steinbach: La question d'origine est vague quant à la langue. Avec des mots-clés
c
etc++
, je pense que les réponses de confronter les deux langues sont raisonnables. - De mon expérience sur d'autres forums techniques, mon intuition est que l'OP vraiment signifie "comment dois-je prendre la représentation textuelle d'un certain nombre (en base 10) et de le convertir au nombre correspondant?" Généralement parlant, le C et le C++ néophytes ont généralement incroyablement floue idées sur la façon dont un texte est dans ces deux langues, et ce
char
signifie vraiment. - Si c'est vrai (je le donne à 50/50 comme beaucoup de premiers tutoriels aussi d'encourager l'obtention de valeurs ASCII de caractères, même si ASCII ne permet pas de couvrir toute la gamme), la coopérative doit clarté, mais c'est un dupe de stackoverflow.com/questions/439573/....
- L'OP a eu trois heures de clarifier cette question et a omis de le faire. Comme il est, il n'y a aucun moyen de savoir ce qui est réellement demandé. A voté pour les fermer.
- C'est probablement une dup de quelque chose de toute façon, en fait...
- double possible de Personnage en Entier en C
- Notez que même si vous pouvez faire la conversion implicite d'avant en arrière quand il s'agit de int et char, il y a vraiment des choses importantes à savoir:1)selon la situation, vous risquez de perdre le moins le signe du nombre (stocké comme un char) si vous n'êtes pas prudent. C'est pourquoi il est signé et unsigned char;2)sizeof(char) = 1 octet (toujours; ici, j'ai exclure le caractère LARGE, qui peut être plus 8bits) mais sizeof(int) = au moins 4 octets! Char est un type entier, avec certaines restrictions. Je vous conseille d'éviter d'utiliser des char pour les calculs mathématiques sauf si vous devez vraiment.
Vous devez vous connecter pour publier un commentaire.
Dépend de ce que vous voulez faire:
la lecture de la valeur comme un code ascii, vous pouvez écrire
pour convertir le caractère
'0' -> 0
,'1' -> 1
, etc, vous pouvez écrire&
-> -10), et il vous donne des nombres supérieurs à 10 (commex
-> 26)'1'
fournit un nombre ascii qui n'est pas1
, vous devez supprimer le décalage'0'
pour réaligner à compter de 0 à 9. Les numéros consécutifs de 1 à 9 sont adjacents dans l'ascii nombre entier.Bien, dans le code ASCII, les chiffres (digits) début de 48. Tout ce que vous devez faire est de:
int x = character - '0'
C et C++ toujours encourager à au moins
int
. En outre, les chaînes de caractères sont de typeint
en C etchar
en C++.Vous pouvez convertir un
char
type simplement en attribuant à unint
.operator+()
à cette fin.int a = c;
) gardent des valeurs négatives, ce qui C les fonctions de bibliothèque standard ne peut pas traiter avec. La bibliothèque C standard des fonctions de la norme pour ce que cela signifie pour gérerchar
valeursint
.int a = c;
comme étant suffisant.char est à seulement 1 octet entier. Il n'y a rien de magique avec le type char! Comme vous pouvez attribuer un court à un int ou un int à un long, vous pouvez attribuer un char int.
Oui, le nom du type de données primitif se trouve être "char", ce qui insinue qu'il ne doit contenir que des caractères. Mais en réalité, le "char" est juste un mauvais nom choix de confondre tout le monde qui essaie d'apprendre la langue. Un meilleur nom pour ce qu'il est int8_t, et vous pouvez utiliser ce nom au lieu de cela, si votre compilateur suit le dernier C standard.
Bien sûr, vous devrait utiliser le type char quand on fait de la manipulation des chaînes, car l'indice de la classique de la table ASCII correspond à 1 octet. Vous pourrait cependant, la manipulation des chaînes régulières ints, bien qu'il n'y a aucune raison pratique dans le monde réel, pourquoi vouloir le faire. Par exemple, le code suivant fonctionne parfaitement:
Que vous avez à réaliser que les caractères et les chaînes de caractères sont des chiffres, comme tout le reste dans l'ordinateur. Lorsque vous écrivez " a " dans le code source, il est pré-traités dans le numéro 97, qui est une constante entière.
Donc, si vous écrivez une expression comme
c'est en fait équivalent à
qui est ensuite passer par le langage C entier promotions
et puis tronqué à un char à adapter le type de résultat
Il y a beaucoup de choses subtiles comme cela se passe entre les lignes, où le char est implicitement considéré comme un int.
ascii
, vous ne devriez pas supposer tout d'encodage spécifiques. Réglagechar
égal àint8_t
est faux, car il pourrait tout aussi susceptibles d'êtreuint8_t
ouuint24_t
.char
est toujours de 1 octet et si les typesint8_t
/uint8_t
existe pas sur le système (ce qui est très probable), ils seront en mesure de s'adapter à la suite d'unechar
, car il sera alors de 8 bits. Très exotiques comme les systèmes de différents obsolètes Dsp,char
sera de 16 bits et leuint8_t
n'existent pas. L'écriture de code pour la compatibilité avec obsolètes Dsp est un non-sens, comme c'est écrit pour la compatibilité avec un complément ou un sign & amplitude systèmes. Énorme gaspillage de temps, puisque de tels systèmes n'existent pratiquement pas dans le monde réel.(Cette réponse adresses le C++ côté des choses, mais l'extension du signe problème existe dans C trop.)
De la manipulation de tous les trois
char
types (signed
,unsigned
, etchar
) est plus délicate qu'il n'y paraît. Les valeurs dans la plage de 0 àSCHAR_MAX
(127 pour un 8-bitchar
) sont faciles:Mais, quand
somevalue
est en dehors de cette plage, seulement en passant parunsigned char
vous donne des résultats cohérents pour le "même"char
valeurs dans l'ensemble des trois types:Ceci est important lors de l'utilisation de fonctions de ctype.h, comme
isupper
outoupper
, en raison de l'extension du signe:Note la conversion à travers int est implicite; c'est le même UB:
Pour résoudre ce problème, passez par
unsigned char
, qui est facilement fait en enroulant ctype.h fonctions par le biais de safe_ctype:Cela fonctionne parce que toute fonction de prendre l'un des trois char types peuvent aussi prendre les deux autres char types. Elle conduit à deux fonctions qui peuvent traiter tout les types:
ord(c)
vous donne toujours une valeur non-négative – même lorsqu'il est passé d'un négatifchar
ou négatifsigned char
– etchr
prend toute valeurord
produit et redonne exactement la mêmechar
.Dans la pratique, je serais probablement juste fonte à travers
unsigned char
au lieu d'utiliser ceux-ci, mais ils ne se, de façon succincte, l'envelopper de la fonte, de fournir un moyen pratique d'ajouter la vérification des erreurs pourint
-à-char
, et serait plus court et plus clair lorsque vous avez besoin de les utiliser plusieurs fois dans la proximité.Utilisation
static_cast<int>
:Edit: Vous devriez probablement essayer d'éviter d'utiliser
(int)
découvrez Pourquoi utiliser static_cast<int>(x) au lieu de (int)x? pour plus d'info.
Ça dépend de ce que tu veux dire par "convertir".
Si vous avez une série de caractères qui représente un nombre entier, comme "123456", alors il y a deux façons les plus courantes de le faire en C: Utilisation d'un objectif de conversion comme atoi() ou strtol(), ou l'usage général sscanf(). C++ (qui est vraiment une langue différente, en se faisant passer pour une mise à niveau) ajoute une troisième, stringstreams.
Si vous voulez dire que vous voulez l'exact modèle de bits dans un de vos
int
variables pour être traitée comme unechar
, c'est plus facile. En C les différents types d'entiers sont vraiment de plus d'un état d'esprit que le réel distinct "types". Juste de commencer à l'utiliser oùchar
s est demandé, et vous devriez être OK. Vous pouvez avoir besoin d'une conversion explicite de faire le compilateur arrêter de pleurnicher sur l'occasion, mais tout ce que doivent faire est de déposer tous les extra passé 256.Je n'ai absolument
null
compétences en C, mais pour une analyse simple:...cela a fonctionné pour moi:
Je suppose que vous voulez que cette conversion pour l'utilisation des fonctions de la bibliothèque C standard.
Dans ce cas, n' (syntaxe C++)
L'expression
UChar( c )
convertit àunsigned char
afin de se débarrasser des valeurs négatives, ce qui, sauf pour les expressions du FOLKLORE, ne sont pas pris en charge par les fonctions C.Ensuite le résultat de cette expression est utilisée comme argument réel pour un
int
argument formel. Lorsque vous obtenez la promotion automatique àint
. Vous pouvez également écrire cette dernière étape explicitement, commeint( UChar( c ) )
, mais personnellement, je trouve que trop verbeux.Cheers & hth.,
J'ai eu des problèmes de convertir un char tableau comme
"7c7c7d7d7d7d7c7c7c7d7d7d7d7c7c7c7c7c7c7d7d7c7c7c7c7d7c7d7d7d7c7c2e2e2e"
dans sa réelle valeur entière qui serait en mesure d'être représenté par " 7C " comme une valeur hexadécimale. Donc, après la croisière pour obtenir de l'aide, j'ai créé ce, et pensé qu'il serait cool de partager.Ce qui sépare la chaîne de char dans son droit entiers, et peut être utile à plus de gens que juste moi 😉
Espère que cela aide!
Char ou short int, vous avez juste besoin d'affecter la valeur.
Même à int64.
Toutes les valeurs seront 16.