Respostas:
De acordo com outras respostas, está bom:
char c = '5';
int x = c - '0';
Além disso, para verificação de erros, você pode desejar verificar se isdigit (c) é verdadeiro primeiro. Observe que você não pode fazer o mesmo de forma totalmente portátil para letras, por exemplo:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
O padrão garante que os valores de char para os dígitos de '0' a '9' sejam contíguos, mas não oferece garantia para outros caracteres, como letras do alfabeto.
Subtraia '0' assim:
int i = c - '0';
O padrão C garante que cada dígito no intervalo '0'..'9'
seja um maior que o dígito anterior (na seção 5.2.1/3
do rascunho C99 ). O mesmo vale para C ++.
Se, por alguma coincidência maluca, você quiser converter uma sequência de caracteres em um inteiro, você também pode fazer isso!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
agora é 1024. Aparentemente atoi()
está bem, e o que eu disse sobre isso antes só se aplica a mim (no OS X (talvez (insira a piada do Lisp aqui))). Ouvi dizer que é uma macro que mapeia aproximadamente para o próximo exemplo, que usa strtol()
uma função de uso mais geral para fazer a conversão:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
funciona assim:
long strtol(const char *str, char **endptr, int base);
Ele é convertido *str
em um long
, tratando-o como se fosse um base
número base . Se **endptr
não for nulo, ele contém o primeiro caractere diferente de dígito strtol()
encontrado (mas quem se importa com isso).
itoa_s()
.
Subtraia char '0' ou int 48 assim:
char c = '5';
int i = c - '0';
Explicação: Internamente, funciona com valor ASCII . Na tabela ASCII, o valor decimal do caractere 5 é 53 e 0 é 48 . Então 53 - 48 = 5
OU
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
Isso significa que se você deduzir 48 de qualquer caractere numérico, ele converterá o inteiro automaticamente.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'
já é do tipo int
, então você não precisa do elenco. Mesmo se não fosse, o gesso não é necessário.
Para converter o dígito do caractere em um inteiro correspondente. Faça como mostrado abaixo:
char c = '8';
int i = c - '0';
A lógica por trás do cálculo acima é brincar com os valores ASCII. O valor ASCII do caractere 8 é 56, o valor ASCII do caractere 0 é 48. O valor ASCII do inteiro 8 é 8.
Se subtrairmos dois caracteres, a subtração acontecerá entre ASCII de caracteres.
int i = 56 - 48;
i = 8;
Se for apenas um único caractere 0-9 em ASCII, subtrair o valor do caractere ASCII zero do valor ASCII deve funcionar bem.
Se você deseja converter números maiores, faça o seguinte:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** não se esqueça de verificar o status (que deve ser 1 se funcionou no caso acima).
Paulo.
Quando preciso fazer algo assim, pré-preparo um array com os valores que desejo.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Então a conversão é fácil
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Essa é basicamente a abordagem adotada por muitas implementações da biblioteca ctype. Você pode adaptar isso trivialmente para funcionar com dígitos hexadecimais também.
Basta usar a atol()
função:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Se o seu dígito for, digamos, '5'
em ASCII, ele será representado como o número binário 0011 0101
(53). Cada dígito tem os quatro bits mais altos 0011
e os 4 bits mais baixos representam o dígito em bcd. Então você apenas faz
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
para obter os 4 bits mais baixos, ou, o que é igual, o dígito. Em asm, ele usa and
operação em vez de sub
(como nas outras respostas).
'5'
é 53 ( 00110101
)
Aqui estão as funções auxiliares que permitem converter dígito em char para int e vice-versa:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
use a função: atoi para array para inteiro, atof para array para tipo float; ou
char c = '5';
int b = c - 48;
printf("%d", b);