Perché sottraendo ‘0’ in C risulta il numero che il char sta rappresentando?

Qualcuno può spiegare perché funziona?

char c = '9'; int x = (int)(c - '0'); 

Perché sottraendo ‘0’ da un codice ASCII di un char risulta il numero che quel char sta rappresentando?

Perché i caratteri sono tutti rappresentati da un numero e “0” è il primo di tutti.

Nella tabella seguente vedi che:

 '0' => 48 '1' => 49 '9' => 57. 

Di conseguenza: ( '9''0' ) = (57 – 48) = 9

inserisci la descrizione dell'immagine qui Fonte: http://www.asciitable.com

char è un tipo intero, proprio come int e famiglia. Un object di tipo char ha un valore numerico. Il mapping tra i caratteri che scrivi in ​​un carattere letterale (come '0' ) e il valore che l’object char ha è determinato dalla codifica di quel carattere nel set di caratteri di esecuzione :

  • C ++ 11 §2.14.3:

    Un letterale di carattere ordinario che contiene un singolo c-char rappresentabile nel set di caratteri di esecuzione ha carattere char , con valore uguale al valore numerico della codifica del c-char nel set di caratteri di esecuzione.

  • C99 §6.4.4.4:

    Una costante di carattere intero è una sequenza di uno o più caratteri multibyte racchiusi tra virgolette singole, come in 'x' .

    […]

    Una costante di carattere intero ha tipo int .

    Si noti che l’ int può essere convertito in un char .

La scelta del set di caratteri di esecuzione dipende dall’implementazione. Più spesso, la scelta è compatibile ASCII, quindi le tabelle pubblicate in altre risposte hanno i valori appropriati. Tuttavia, il set di caratteri non deve essere compatibile ASCII. Ci sono alcune restrizioni, però. Uno di questi è il seguente (C ++ 11 §2.3, C99 §5.2.1):

 abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ 0 1 2 3 4 5 6 7 8 9 _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ' 

[…]

In entrambi i set di caratteri di base di origine ed esecuzione, il valore di ciascun carattere dopo 0 nell’elenco precedente di cifre decimali deve essere maggiore del valore del precedente.

Ciò significa che qualunque valore abbia il carattere '0' , il carattere '1' ha valore superiore a '0' , e il carattere '2' ha valore un altro oltre a quello, e così via. I caratteri numerici hanno valori consecutivi. Puoi riassumere la mapping in questo modo:

 Character: 0 1 2 3 4 5 6 7 8 9 Corresponding value: X X+1 X+2 X+3 X+4 X+5 X+6 X+7 X+8 X+9 

Tutti i caratteri numerici hanno valori sfalsati rispetto al valore di '0' .

Ciò significa che se hai un personaggio, diciamo '9' e sottrai '0' da esso, ottieni la “distanza” tra il valore di '9' e il valore di '0' nel set di caratteri di esecuzione. Poiché sono consecutivi, la distanza sarà 9.

Perché lo standard C garantisce che i caratteri 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 siano sempre in questo ordine per quanto riguarda il loro codice numerico. Quindi, se sottrai il codice char di '0' da un’altra cifra, darà la sua posizione relativa a 0 , che è il suo valore …

Dallo standard C, Sezione 5.2.1 Set di caratteri:

In entrambi i set di caratteri di base di origine ed esecuzione, il valore di ciascun carattere dopo 0 nell’elenco precedente di cifre decimali deve essere maggiore di uno del valore del precedente

Perché i letterali sono disposti in sequenza.

Quindi se 0 era 48, 1 sarà 49, 2 sarà 50 ecc. In ASCII, quindi x conterrà, il valore di ascii di '9' meno il valore di ascii di '0' che significa che il valore di ascii di '9' sarebbe essere 57 e quindi, x conterrebbe 57 - 48 = 9 .

Inoltre, char è un tipo integrale.

Guarda la TABELLA ASCII :

 '9' in ASCII = 57 //in Decimal '0' in ASCII = 48 //in Decimal 

57 – 48 = 9

il codice ascii dei caratteri numerici è ordinato nell’ordine '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' come indicato nella tabella ascii

quindi se facciamo la differenza tra asii di '9' e ascii di '0' ne otterremo 9

Nella tabella ASCII le cifre sono allineate in sequenza, iniziando dal codice più basso per 0 . Se si sottrae un numero superiore da 0 , si crea la differenza dei due valori ASCII. Quindi, 9 ha valore 57 e 0 ha 48 , quindi se sottrai 48 da 57 ottieni 9. Basta dare un’occhiata alla tabella ASCII.

Guarda qui

Primo tentativo:

 cout << (int)'0' << endl; 

ora prova:

 cout << (int)'9' << endl; 

i caratteri di riconoscimento rappresentano numeri in forma di testo, ma hanno un valore diverso se presi come numeri. Windows utilizza un numero per decidere quale elemento di design stampare. Quindi il numero 0x30 rappresenta il charictor 0 nel sistema operativo Windows. Il numero 0x39 rappresenta il personaggio. 9. Dopotutto, tutto ciò che un computer può riconoscere sono i numeri, non sa cosa sia un "carattere".

Sfortunatamente (int)('f' - '0') non è uguale a 15, però.

Questo ti dà i vari simboli e il numero di windows utilizza per rappresentarli. http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

Se hai bisogno di trovarlo per un altro sistema operativo, puoi cercare: Virtual Key Codes in Google. per vedere quali altri SO hanno come codici.