Нет никакой разницы между текстовыми данными или любыми другими типами данных как таковыми, поэтому компьютер не может различить ASCII-символ или простое число в памяти.
Однако, процесс , действующий на этих данных, обрабатывает различное содержимое памяти по-разному и поставляется со «знанием» типа данных, вставленных в его последовательность команд. Например, для вызова printf () аргумент должен быть строкой символов (символьная строка с нулевым символом в конце). Итак, у вас это есть, знания в процессе, а не данные.
Это может привести к проблемам, потому что программист должен убедиться, что правильные типы аргументов (данных) переданы определенной функции (процессу). - К счастью, компиляторы (и другие помощники, используемые во время разработки во время время компиляции или раньше, например, с помощью статический анализ ), также "знают", как вещи должны быть напечатаны (в случае строго типизированные языки ), поэтому неисправная программа обычно не компилируется. - Но в любом случае, например, в C, вы можете обрабатывать любое содержимое памяти как любой тип данных, который вы хотели бы (например, приведение типа ), с некоторыми ограничениями, даже как исполняемый код.
Во время выполнения (почти) ничто не мешает программе интерпретировать данные в произвольной ячейке памяти как текст ASCII или простые числа, это просто вопрос представления.
Однако существуют соглашения о том, как программа структурирована и где она хранит текст в виде статических строк, известных во время компиляции, то есть в виде простого текста. Обычно они помещаются в сегмент .data или .rodata программы (обычно не в сегменте .text). Вы можете сканировать двоичную программу, используя строки , например:
$ strings /usr/bin/strings
Или, если вы хотите узнать больше о сегментах .data / .rodata, вам может пригодиться binutils '1032 * objdump :
$ objdump -h /usr/bin/strings
$ objdump --full-contents --section .rodata /usr/bin/strings
То же самое можно сделать с помощью шестнадцатеричного редактора:
$ xxd <my-binary>
$ xxd /usr/bin/strings
В конце концов, каждая программа должна знать , как обращаться с ее памятью и как интерпретировать отдельные биты двоичных данных в ней. Программа обычно выполняется внутри операционной системы, которая определяет другие типы ограничений в отношении того, какие области памяти доступны и как, и программа может взаимодействовать с другими процессами вне или внутри коробки (разрешения на доступ, системные API, которые требуют определенный тип данных, например, текстовые или двоичные данные). Но опять же, в этом случае знания также лежат в процессах, а не в самих данных. Аппаратные средства (то есть процессор и память (RAM, FLASH ...)) не обрабатывают текстовые данные принципиально иначе, чем другие типы данных.