C - преобразовать char в int

Я знаю, что для преобразования любого заданного char в int возможен этот код [кроме atoi()]:

int i = '2' - '0';

но я никогда не понимал, как это работает, каково значение «0», и я, кажется, не нашел никаких объяснений в сети по этому поводу.

Заранее спасибо!!


person Ahmed Mohamed    schedule 11.07.2012    source источник
comment
спасибо за все ответы, очень полезный материал :)   -  person Ahmed Mohamed    schedule 11.07.2012


Ответы (10)


В C символьный литерал имеет тип int. [символьные литералы/IBM]

В вашем примере числовое значение '0' равно 48, числовое значение '2' равно 50. Когда вы делаете '2' - '0', вы получаете 50 - 48 = 2. Это работает для чисел ASCII от 0 до 9.

См. таблицу ASCII, чтобы получить более полное представление.

Изменить: Спасибо @ouah за исправление.

person Alex    schedule 11.07.2012
comment
Поэтому, когда я добавляю или вычитаю любой тип символов, я манипулирую их кодами ASCII ?? - person Ahmed Mohamed; 11.07.2012
comment
@Alex, числовое значение «2» равно 50, а не 58. - person Siddiqui; 11.07.2012
comment
@engheema: Да и нет. Существует тонкая разница между тем, чтобы быть равным 2 или равным «2», что равно 50. Зависит от того, на какую интерпретацию char вы смотрите. - person inVader; 11.07.2012
comment
'0' равно int не из-за целочисленного продвижения, а потому, что тип символьных литералов int. - person ouah; 11.07.2012

Все символы в C представлены целочисленным значением, кодом ASCII символа. Например, «0» соответствует 48, а «2» соответствует 50, поэтому '2'-'0' дает вам 50-48 = 2

Ссылка на таблицу ASCII: http://www.robelle.com/smugbook/ascii.html

person Luke Morgan    schedule 11.07.2012

Когда вы используете запятые ' ', вы обрабатываете число как char, и если оно задано как int, то int примет значение ASCII-кода этого символа.

person Dan    schedule 11.07.2012

Любой символьный литерал, заключенный в одинарные кавычки, соответствует числу, представляющему код ASCII этого символа. На самом деле такие литералы оцениваются не как char, а как int, поэтому они вполне взаимозаменяемы с другими числовыми литералами.

В вашем выражении '2' взаимозаменяемо с 50, а '0' взаимозаменяемо с 48.

person Blagovest Buyukliev    schedule 11.07.2012

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

'0' представлен как 0x30, '9' представлен как 0x32.

Это приводит к

0x32 - 0x30 = 2
person Femaref    schedule 11.07.2012

Все дело в кодах ASCII соответствующих символов.

В C все цифры (от 0 до 9) кодируются в ASCII значениями от 48 до 57 последовательно. Таким образом, '0' на самом деле получает значение 48, а '2' имеет значение 50. Поэтому, когда вы пишете int i = '2' - '0';, вы на самом деле вычитаете 48 из 50 и получаете 2.

person Sufian Latif    schedule 11.07.2012

'0' до '9' гарантированно являются последовательными значениями в C во всех наборах символов. Это не ограничивается ASCII, а C не ограничивается набором символов ASCII.

Итак, последовательность здесь означает, что значение '2' равно '0' + 2.

Относительно int и char обратите внимание, что значения '0' и '9' относятся к типу int в C, а не к типу char. Символьный литерал имеет тип int.

person ouah    schedule 11.07.2012

Оба термина внутренне представлены кодом ASCII числа, и, поскольку числовые цифры имеют последовательные коды ASCII, их вычитание дает вам разницу между двумя числами.

Вы можете проделывать аналогичные трюки и с символами, например, сменить нижний регистр на верхний, вычитая 32 из строчного символа.

'a' - 32 = 'A'
person fvu    schedule 11.07.2012

Это работает только потому, что ASCII присваивает коды символам по порядку, т. е. «2» имеет код символа, который на 2 больше, чем код символа «0».

В другой кодировке это не сработает.

person Razvan    schedule 11.07.2012

Когда вы приводите char к int, он фактически сопоставляет каждый символ с соответствующим числом в таблице ascii.

Это означает, что '2' - '0' преобразуется в 50 - 48. Таким образом, вы также можете узнать числовое расстояние между двумя буквами таким же образом, например. 'z' - 'a' равно 122 - 97 равно 25

Вы можете найти числовое представление каждого символа ASCII в этой таблице: http://www.asciitable.com/

На самом деле char — это просто байт без знака: C просто обрабатывает его по-разному для разных операций. Например, printf(97) дает 97 на выходе, но printf((char)97) дает вам 'a' на выходе.

person devsnd    schedule 11.07.2012