Задать вопрос
mksmvnv
@mksmvnv

Верно ли я понял процесс преобразование целого типа данных в символьный на C?

Я написал коротенький код для визуального понимания.

#include <stdio.h>

int main()
{
    int x = 42;
    x /= 10;
    x += '0';
    printf("%c", x);
    return 0;
}

Правильно ли я понял, что если к целому типу данных (цифре 4), я прибавляю символ '0' , то целый тип преобразовывается в символьный и на выходе мы получаем символ '4'?
  • Вопрос задан
  • 241 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
mksmvnv
@mksmvnv Автор вопроса
На стеке объяснили по подробнее, теперь понял)

'0' is just the human readable represetation of the integer 48 which is considered as code for the character '0' in ASCII.

ASCII digit codes:

xNvyW.png
When you add 4 to 48 which is integer representation of '0' you are getting 52.
When you write it it to the screen then the character represented by its code is being displaed (in this case '4')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
milssky
@milssky
Координатор племени фиолетовых обезьянок
Если к цифре прибавить **код** символа нуля, то получится символ цифры. А так да, код будет преобразован в число. Т.ч. понял верно. Для проверки себя можно нагуглить любую таблицу ASCII символов и убедится в этом.
Ответ написан
includedlibrary
@includedlibrary
В таблице ASCII все символы имеют 7 битный код, цифры расположены последовательно от 0 до 9, поэтому прибавление к значению от 0 до 9 кода сивола '0', вы получаете код символа, соответствующего данному значению. Но тип переменной не меняется, как был int, так им и остался.
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Не совсем. Действительно, вы получаете в x код символа '4'. Но вы не преобразуете его в символьный. Это все еще int (скорее всего, 4-х байтный). В данном конкретном случае, это работает. Но тут вам повезло, что printf может вместо char принять int и правильно его синтерпретировать. Правильнее было бы преобразовать к char перед передачей в printf:
printf("%c", (char)x);

Вот тут уже действительно происходит преобразование к символьному типу char.

Edit:
Немного не прав был. printf надо передавать int, даже если формат "%с". Но какой-нибудь другой функции может понадобится именно char.
Ответ написан
@AVI-crak
Int может быть больше 9, и тогда символ цифры не получится.
Однако если взять процент ((x%10)+'0') - то можно получить младший элемент строки в символьном варианте char. Повторять пока x не равен нулю. Кроме того, int x может быть отрицательным числом, и тогда всё поломается. Работать можно только с числом без знака, для этого сначала выполняется проверка, и если число меньше нуля - то (x=0-x). Когда x в цикле станет равен нулю - нужно просто добавить к строке минус.
Это очень простой код, в целях обучения ты должен написать его сам.
Ответ написан
Комментировать
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Нет. Никакого преобразования типов не произошло.
int x = 42;
Присвоили переменной х типа int (как правило четырехбайтовой, знаковой) значение 42;
x /= 10;
Поделили нацело на 10, получили 4
x += '0';
Прибавили к x 48 (код символа '0'). Где тут преобразование типа? Равным образом могло стоять 'A', 'Z', '+' и т.д. Компилятор просто решил, что Вам так удобнее записать свою мысль.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы