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)


arrow_upward
8
arrow_downward

В 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

arrow_upward
3
arrow_downward

Все символы в 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

arrow_upward
2
arrow_downward

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

person Dan    schedule 11.07.2012

arrow_upward
2
arrow_downward

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

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

person Blagovest Buyukliev    schedule 11.07.2012

arrow_upward
2
arrow_downward

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

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

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

0x32 - 0x30 = 2
person Femaref    schedule 11.07.2012

arrow_upward
2
arrow_downward

Все дело в кодах 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

arrow_upward
2
arrow_downward

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

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

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

person ouah    schedule 11.07.2012

arrow_upward
2
arrow_downward

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

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

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

arrow_upward
2
arrow_downward

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

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

person Razvan    schedule 11.07.2012

arrow_upward
2
arrow_downward

Когда вы приводите 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