Почему вычитание "0" в C приводит к числу, которое представляет символ?

Может кто-нибудь объяснить, почему это работает?

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

Почему вычитание "0" из кода ascii результата char означает число, которое представляет этот символ?

Ответ 1

Потому что char все представлены числом, а "0" является первым из всех.

В таблице ниже вы увидите следующее:

'0' => 48
'1' => 49


'9' => 57.

В результате: ('9' - '0') = (57 - 48) = 9

enter image description here Источник: http://www.asciitable.com

Ответ 2

char - целочисленный тип, точно так же, как int и family. Объект типа char имеет некоторое числовое значение. Отображение между символами, которые вы вводите в символьном литерале (например, '0') и значением, которое имеет объект char, определяется кодировкой этого символа в наборе символов выполнения:

  • С++ 11 §2.14.3:

    Литерал обычного символа, который содержит единственный c-char, представленный в наборе символов выполнения, имеет тип char, со значением, равным числовому значению кодирования c-char в наборе символов выполнения.

  • C99 §6.4.4.4:

    Целочисленная символьная константа представляет собой последовательность из одного или нескольких многобайтовых символов, заключенных в одиночные кавычки, как в 'x'.

    [...]

    Целочисленная символьная константа имеет тип int.

    Обратите внимание, что int может быть преобразован в char.

Выбор набора символов выполнения зависит от реализации. Чаще всего выбор является совместимым с ASCII, поэтому таблицы, опубликованные в других ответах, имеют соответствующие значения. Однако набор символов не должен быть совместимым с ASCII. Однако есть некоторые ограничения. Один из них следующий (С++ 11 §2.3, C99 §5.2.1):

a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " 

[...]

В базовых наборах исходного и исполняемого символов значение каждого символа после 0 в приведенном выше списке десятичных цифр должно быть больше, чем значение предыдущего.

Это означает, что независимо от значения, которое имеет символ '0', символ '1' имеет значение больше, чем '0', а символ '2' имеет значение еще один и т.д. Числовые символы имеют последовательные значения. Вы можете суммировать отображение следующим образом:

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

Все символы цифр имеют значения, смещенные от значения '0'.

Это означает, что если у вас есть символ, скажем '9' и вычитаем из него '0', вы получите "расстояние" между значением '9' и значением '0' в наборе символов выполнения. Поскольку они являются последовательными, расстояние будет равно 9.

Ответ 3

Поскольку стандарт C гарантирует, что символы 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 всегда находятся в этом порядке относительно их числового символьного кода. Итак, если вы вычтите код символа '0' из другой цифры, он будет указывать свою позицию относительно 0, что является ее значением...

Из стандарта C, раздел 5.2.1. Наборы символов:

В обоих базовых наборах исходного и исполняемого значений значение каждого символа после 0 в приведенном выше списке десятичных цифр должно быть больше, чем значение предыдущего

Ответ 4

Потому что литералы расположены последовательно.

Итак, если 0 равно 48, 1 будет 49, 2 - 50 и т.д. В ASCII, то x будет содержать значение ascii '9' минус значение ascii '0' что означает, что значение ascii '9' будет 57, и, следовательно, x будет содержать 57 - 48 = 9.

Кроме того, char является интегральным типом.

Ответ 5

код ascii числовых символов упорядочен в порядке '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' как указано в таблице ascii

поэтому, если мы делаем различие между asii of '9' и ascii '0' мы получим 9

Ответ 6

В таблице ASCII Цифры выровнены последовательно, начиная с младшего кода для 0. Если вы вычтите большее число из 0, вы создадите разницу двух значений ASCII. Итак, 9 имеет значение 57 и 0 имеет 48, поэтому, если вы вычтите 48 из 57, вы получите 9. Просто посмотрите таблицу ASCII.

Посмотрите здесь.

Ответ 7

Посмотрите таблицу ASCII:

'9' in ASCII =  57 //in Decimal

'0' in ASCII =  48 //in Decimal

57 - 48 = 9

Ответ 8

Первая попытка:

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

теперь попробуйте:

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

charictors представляют числа в текстовой форме, но имеют другое значение, когда принимаются в виде числа. Windows использует номер, чтобы решить, какой графический объект печатать. Таким образом, число 0x30 представляет charictor 0 в ОС Windows. Число 0x39 представляет charictor 9. В конце концов, все компьютер может распознать числа, он не знает, что такое "char".

Unfortunatly (int)('f' - '0') не равно 15.

Это дает вам различные индикаторы и числовые окна, используемые для их представления. http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

Если вам нужно найти это для другой ОС, вы можете Virtual Key Codes <OSname> поиск: Virtual Key Codes <OSname> в Google. чтобы узнать, что у других ОС есть их коды.