Может кто-нибудь объяснить, почему это работает?
char c = '9';
int x = (int)(c - '0');
Почему вычитание "0" из кода ascii результата char означает число, которое представляет этот символ?
Может кто-нибудь объяснить, почему это работает?
char c = '9';
int x = (int)(c - '0');
Почему вычитание "0" из кода ascii результата char означает число, которое представляет этот символ?
Потому что char все представлены числом, а "0" является первым из всех.
В таблице ниже вы увидите следующее:
'0' => 48
'1' => 49
'9' => 57.
В результате: ('9'
- '0'
) = (57 - 48) = 9
Источник: http://www.asciitable.com
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.
Поскольку стандарт C гарантирует, что символы 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
всегда находятся в этом порядке относительно их числового символьного кода. Итак, если вы вычтите код символа '0'
из другой цифры, он будет указывать свою позицию относительно 0
, что является ее значением...
Из стандарта C, раздел 5.2.1. Наборы символов:
В обоих базовых наборах исходного и исполняемого значений значение каждого символа после 0 в приведенном выше списке десятичных цифр должно быть больше, чем значение предыдущего
Потому что литералы расположены последовательно.
Итак, если 0
равно 48, 1
будет 49, 2
- 50 и т.д. В ASCII, то x
будет содержать значение ascii '9'
минус значение ascii '0'
что означает, что значение ascii '9'
будет 57, и, следовательно, x
будет содержать 57 - 48 = 9
.
Кроме того, char
является интегральным типом.
код ascii числовых символов упорядочен в порядке '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
как указано в таблице ascii
поэтому, если мы делаем различие между asii of '9'
и ascii '0'
мы получим 9
В таблице ASCII Цифры выровнены последовательно, начиная с младшего кода для 0
. Если вы вычтите большее число из 0
, вы создадите разницу двух значений ASCII. Итак, 9
имеет значение 57
и 0
имеет 48
, поэтому, если вы вычтите 48 из 57, вы получите 9. Просто посмотрите таблицу ASCII.
Посмотрите здесь.
Посмотрите таблицу ASCII:
'9' in ASCII = 57 //in Decimal
'0' in ASCII = 48 //in Decimal
Первая попытка:
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. чтобы узнать, что у других ОС есть их коды.