Como converter char para int?

Qual é a maneira correta de converter um char em int ? Isso dá 49 :

 int val = Convert.ToInt32('1'); //int val = Int32.Parse("1"); // Works 

Eu não quero converter em string e depois analisá-lo.

Estou surpreso que ninguém tenha mencionado o método estático embutido no System.Char

 int val = (int)Char.GetNumericValue('8'); // val == 8 

que tal (para char c )

 int i = (int)(c - '0'); 

que faz subtração do valor de char?

Re a pergunta API (comentários), talvez um método de extensão?

 public static class CharExtensions { public static int ParseInt32(this char value) { int i = (int)(value - '0'); if (i < 0 || i > 9) throw new ArgumentOutOfRangeException("value"); return i; } } 

Em seguida, use int x = c.ParseInt32();

O que todo mundo está esquecendo está explicando PORQUE isso acontece.

Um Char é basicamente um inteiro, mas com um ponteiro na tabela ASCII. Todos os caracteres têm um valor inteiro correspondente, como você pode ver claramente ao tentar analisá-lo.

Pranay tem claramente um conjunto de caracteres diferente, é por isso que o seu código não funciona. o único caminho é

 int val = '1' - '0'; 

porque isso procura o valor inteiro na tabela de '0' que é então o ‘valor base’ subtraindo o seu número em formato de caractere, a partir disso, você receberá o número original.

 int i = (int)char.GetNumericValue(c); 

Ainda outra opção:

 int i = c & 0x0f; 

Isso também deve ser feito.

 int val = '1' - '0'; 

Isto pode ser feito usando códigos ascii, onde ‘0’ é o menor e os caracteres numéricos contam a partir daí

 int val = '1' - 48; 

Você pode usar o seguinte método de extensão:

 public static class CharExtensions { public static int CharToInt(this char c) { if (c < '0' || c > '9') throw new ArgumentException("The character should be a number", "c"); return c - '0'; } } 

A maneira mais segura de conseguir isso é usando o método Int32.TryParse. Veja aqui: http://dotnetperls.com/int-tryparse

Uma extensão de algumas outras respostas que cobrem a representação hexadecimal:

  public int CharToInt(char c) { if (c >= '0' && c <= '9') { return c - '0'; } else if (c >= 'a' && c <= 'f') { return 10 + c - 'a'; } else if (c >= 'A' && c <= 'F') { return 10 + c - 'A'; } return -1; } 

Você pode tentar algo assim:

 int val = Convert.ToInt32("" + '1'); 
 int val = '1' & 15; 

O binário dos caracteres ASCII 0-9 é:

0 – 00110000

1 – 00110001

2 – 00110010

3 – 00110011

4 – 00110100

5 – 00110101

6 – 00110110

7 – 00110111

8 – 00111000

9 – 00111001

e se você pegar em cada um deles os primeiros 4 LSB (usando bit a bit AND com 8’b00001111 que equivale a 15) você obtém o número real (0000 = 0,0001 = 1,0010 = 2, …)