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

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

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 , определяется кодировкой этого символа в наборе символов выполнения :

  • C ++ 11 §2.14.3:

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

  • C99 §6.4.4.4:

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

    […]

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

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

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

 abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ 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 :

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

57 – 48 = 9

код 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.

Послушайте.

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

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

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

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

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

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

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

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

  • C указатели и массивы / оператор 'sizeof'
  • Внутреннее соединение DataTables в C #
  • Как создать динамический массив целых чисел
  • Есть ли способ .NET перечислять все доступные сетевые принтеры?
  • Возможно ли «ожидание возврата доходности DoSomethingAsync ()»
  • Что я должен знать о Structured Exceptions (SEH) в C ++?
  • Вероятность получения дублирующегося значения при вызове метода GetHashCode () в строках
  • Страница HTTP 404 не найдена в Web Api, размещенной в IIS 7.5
  • sizeof class с int, функцией, виртуальной функцией в C ++?
  • Создание циклически связанного списка в C #?
  • В C #, как проверить, доступен ли TCP-порт?
  • Давайте будем гением компьютера.