Это не так.
Терминатор строки - это байт, содержащий все 0 битов.
Целое число без знака - это два или четыре байта (в зависимости от вашей среды), каждый из которых содержит все 0 битов.
Два элемента хранятся по разным адресам. Ваш скомпилированный код выполняет операции, подходящие для строк в первом местоположении, и операции, подходящие для двоичных чисел без знака в последнем. (Если у вас нет ошибки в вашем коде или опасно умного кода!)
Но все эти байты выглядят одинаково для процессора. Данные в памяти (в большинстве распространенных в настоящее время архитектур наборов команд) не имеют какого-либо связанного с ними типа. Это абстракция, которая существует только в исходном коде и что-то значит только для компилятора.
Редактирование добавлено: В качестве примера: вполне возможно, даже обычное, выполнить арифметику для байтов, составляющих строку. Если у вас есть строка из 8-битных символов ASCII, вы можете преобразовать буквы в строке между прописными и строчными буквами, добавив или вычтя 32 (десятичное). Или, если вы переводите в другой символьный код, вы можете использовать их значения в качестве индексов в массиве, элементы которого обеспечивают эквивалентное битовое кодирование в другом коде.
Для процессора символы - это действительно очень короткие целые числа. (восемь бит каждый вместо 16, 32 или 64). Для нас, людей, их значения связаны с читаемыми символами, но процессор не имеет об этом никакого представления. Он также ничего не знает о соглашении «C», заключающемся в том, что «нулевой байт заканчивает строку» (и, как многие отмечали в других ответах и комментариях, существуют среды программирования, в которых это соглашение вообще не используется). ,
Конечно, в x86 / x64 есть некоторые инструкции, которые часто используются со строками - например, с префиксом REP - но вы также можете использовать их в массиве целых чисел, если они достигают желаемого результата.