В чем по сути разница между типами строки и числа, как ЦП вообще различает типы?
Допустим есть переменная строкового типа, которое хранит число:
char a[] = "1024";
и мы можем справедливо полагать, что возможна следующая операция по "превращению" строки (по сути последовательности символов) в число:
int b = a[0];
Из Ascii мы ясно видим, что отдельные символы сами по себе - это числа, и тут даже превращать ничего не нужно, просто нужно работать с ними по отдельности.
Но тогда вопросы:
Тогда в чем по сути разница между типами строки и числа?
Как ЦП вообще различает их (типы) и где хранит информацию, чтобы их отделять друг от друга, когда все они в конце-концов будут единицами и нулями?
Ответы (2 шт):
Все данные хранятся просто как байты памяти.
Процессор никак не различает типы данных. Условно можно сказать, что он различает "типы" по числу байт в них: 1, 2, 4 или 8 - на некоторых архитектурах для обращения к данным соответствующей длины требуется выравнивание, что означает, что, например, двухбайтовое значение не может начинаться с нечётного адреса.
Что касается знакового и беззнакового типа, то они различаются на уровне инструкций процессора. Например, после сравнения cmp можно использовать ja (jump if above) для перехода в зависимости от результата беззнакового сравнения или jg (jump if greater) - от знакового.
Компьютер - это такой большой калькулятор (а может и небольшой). Всё, что он умеет делать, это математические операции с числами и чтение и запись их из памяти/в память и устройства ввода-вывода.
Поэтому, чтобы решить любую задачу на компьютере, её нужно сначала оцифровать - создать её математическую модель и перевести исходные данные в числа. Потом нужно запрограммировать решение в числовом виде, а в конце - перевести результат из числового вида в требуемый. Некоторые из этих операций делают такие устройства и программы-драйверы, как клавиатура и мышка с драйверами HID, дисплей с видеокартой и её драйверами. Многие задачи решаются уже готовыми библиотеками прикладных программ.
Обработка строк реализована в компиляторе языка и его библиотеках. В общем случае тип данных определяется исключительно программой, которая эти данные обрабатывает. Если вы сделали программу, которая обрабатывает строки, то они будут хранится в памяти как числа, но ваша программа "знает", что это строки. Для другой программы те же самые данные могут быть просто числами либо элементами изображения или звука, которые тоже закодированы числами.
Что происходит в вашей программе? Символ 1 хранится в памяти в двух байтах как число 49. Программа знает, что этот кусочек памяти нужно считать символом - это содержание вашей программы char a[] = "1024". Потом она берёт число 49 и сохраняет его в другом кусочке памяти (4 байта) как 49 int b = a[0]. И вы сами в программе вот этой вот строкой определили, что это будет целое 32-битовое число, которое получит значение кода первого символа из массива a - 49. Текст программы на языке высокого уровня компилятор преобразует в машинную программу (которая тоже закодирована числами), которая и делает все эти действия.
Что такое символ 1? Для человеа это изображение, которое он воспринимает зрением и может воссоздать, например, написав ручкой на бумаге. Для человека это цифра один. Когда человек вводит цифру один в компьютер, он нажимает на клавиатуре кнопку с изображением этой цифры, и тут происходит аналогово-цифровое преобразование - в компьютере появляется число 49. Это определено кодировкой ASCII, конструкцией клавиатуры и её драйвером. Тот же самый символ можно ввести в компьтер и как изображение, тогда он будет закодирован там по-другому.
Обратное преобразование числа в изображение осуществляется дисплеем, при этом само число по пути претерпевает множество перекодирований.