Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Ahmed MohamedОтветов: 10

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

int i = '2' - '0';

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

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

  • спасибо за все ответы, очень полезный материал :) Ahmed Mohamed 11.07.2012

ctype-conversion

Ответы

Ответ 1 · рейтинг 8 · Alex

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

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

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

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

Ответ 2 · рейтинг 3 · Luke Morgan

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

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

Ответ 3 · рейтинг 2 · Dan

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

Ответ 4 · рейтинг 2 · Blagovest Buyukliev

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

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

Ответ 5 · рейтинг 2 · Femaref

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

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

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

0x32 - 0x30 = 2

Ответ 6 · рейтинг 2 · Sufian Latif

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

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

Ответ 7 · рейтинг 2 · ouah

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

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

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

Ответ 8 · рейтинг 2 · fvu

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

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

'a' - 32 = 'A'

Ответ 9 · рейтинг 2 · Razvan

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

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

Ответ 10 · рейтинг 2 · devsnd

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы