Как вы указали, подписанный автомобиль может иметь максимальное значение 127. Причина отрицательного числа, однако, заключается в том, как символ хранится в памяти.Все целочисленные типы со знаком сохраняют последний бит для знака, где 0/1 обозначает положительный / отрицательный.Компилятор, однако, не проверяет переполнение, поэтому, когда вы попытались присвоить num значение 220, он переполнил значение в знаковый бит, так как не смог уместить его в первые 7 битов символа (символы 1 байт).В результате, когда вы пытаетесь прочитать то, что находится в памяти, он видит бит знака как брошенный, заставляя компилятор думать, что вместо того, чтобы видеть большое положительное число, как вы предполагали, он вместо этого видит небольшое отрицательное значение.Следовательно, вывод вы видите.
Редактировать Отвечая на ваш обновленный вопрос.Все, что происходит, - это то, что компилятор скопирует или расширит char, чтобы иметь 4 байта памяти, интерпретирует значение char и переписывает его в память нового int.В вашем случае программа во время выполнения будет думать, что символ имеет значение -36 вместо 220, потому что он интерпретирует эти биты как подписанный символ перед приведением.Затем, когда он выполняет приведение, он просто создает int со значением -36.