Верно ли я понял процесс преобразование целого типа данных в символьный на C?
Я написал коротенький код для визуального понимания.
#include <stdio.h>
int main()
{
int x = 42;
x /= 10;
x += '0';
printf("%c", x);
return 0;
}
Правильно ли я понял, что если к целому типу данных (цифре 4), я прибавляю символ '0' , то целый тип преобразовывается в символьный и на выходе мы получаем символ '4'?
'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:
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')
Если к цифре прибавить **код** символа нуля, то получится символ цифры. А так да, код будет преобразован в число. Т.ч. понял верно. Для проверки себя можно нагуглить любую таблицу ASCII символов и убедится в этом.
milssky А как это на машинном уровне работает? Можете вкратце объяснить.
Что заставляет цифру принимать форму символа цифры, но в то же время переменная остается int формата.
В таблице ASCII все символы имеют 7 битный код, цифры расположены последовательно от 0 до 9, поэтому прибавление к значению от 0 до 9 кода сивола '0', вы получаете код символа, соответствующего данному значению. Но тип переменной не меняется, как был int, так им и остался.
Тогда я понял процесс буквально. Что переменная x меняет тип с int на char. Поэтому x печатается без проблем с указателем %c. Но сейчас я увидел, что x в printf остается int типа.
У значения 4 адрес 0000000000000004
У значения '0' адрес 0000000000000030
Если сложить два адреса 0000000000000004 + 0000000000000030 то мы получаем адрес 0000000000000034 что является значением '4'
То есть если я сразу присвою переменной char x = '4', то адрес при выводе будет также 0000000000000034.
Видимо нужно углубиться в эту тему, пока для меня это что то новое.
Интересный момент - пока, вы в коде явно не используете адрес переменной, этого адреса может и не быть, потому что компилятор положил значение в регистр
Maksim Ivanov, Ну и в printf, при указании формата %c надо переменную типа int передавать, а не char.
If no l modifier is present, the int argument is converted to an unsigned char, and the resulting character is written. If an l modifier is present, the wint_t (wide character) argument is converted to a multibyte sequence by a call to the wcrtomb(3) function, with a conversion state starting in the initial state, and the resulting multibyte string is written.
То есть, после того, как я беру число 42, я прогоняю его через условие, отделяю 4 и прибавляю '0'. это позволяет мне вывести символ 4 в консоль, после тоже самое с остатком от деления 2. И в итоге я получил 42 на выходе.
Maksim Ivanov, char на самом деле тоже целочисленный тип. Он по стандарту даже не обязан размерностью от int отличаться. char должен быть размером не меньше байта, а int - не меньше двух.
Не совсем. Действительно, вы получаете в x код символа '4'. Но вы не преобразуете его в символьный. Это все еще int (скорее всего, 4-х байтный). В данном конкретном случае, это работает. Но тут вам повезло, что printf может вместо char принять int и правильно его синтерпретировать. Правильнее было бы преобразовать к char перед передачей в printf: printf("%c", (char)x);
Вот тут уже действительно происходит преобразование к символьному типу char.
Edit:
Немного не прав был. printf надо передавать int, даже если формат "%с". Но какой-нибудь другой функции может понадобится именно char.
Насколько я понимаю, %c подразумевает именно значение типа int, так что лучше к char не приводить:
If no l modifier is present, the int argument is converted to an unsigned char, and the resulting character is written. If an l modifier is present, the wint_t (wide character) argument is converted to a multibyte sequence by a call to the wcrtomb(3) function, with a conversion state starting in the initial state, and the resulting multibyte string is written.
Note regarding the c specifier: it takes an int (or wint_t) as argument, but performs the proper conversion to a char value (or a wchar_t) before formatting it for output
Int может быть больше 9, и тогда символ цифры не получится.
Однако если взять процент ((x%10)+'0') - то можно получить младший элемент строки в символьном варианте char. Повторять пока x не равен нулю. Кроме того, int x может быть отрицательным числом, и тогда всё поломается. Работать можно только с числом без знака, для этого сначала выполняется проверка, и если число меньше нуля - то (x=0-x). Когда x в цикле станет равен нулю - нужно просто добавить к строке минус.
Это очень простой код, в целях обучения ты должен написать его сам.
Нет. Никакого преобразования типов не произошло. int x = 42;
Присвоили переменной х типа int (как правило четырехбайтовой, знаковой) значение 42; x /= 10;
Поделили нацело на 10, получили 4 x += '0';
Прибавили к x 48 (код символа '0'). Где тут преобразование типа? Равным образом могло стоять 'A', 'Z', '+' и т.д. Компилятор просто решил, что Вам так удобнее записать свою мысль.