Поскольку объявление функции включает в себя список типов параметров, компилятор знает тип ожидаемого параметра. Затем он может косвенно привести действительный параметр к ожидаемому типу. Фактически компилятор обрабатывает вызов функции так, как если бы он был:
doSomething((uint32_t) num_8);
Старые программисты, которые когда-то использовали (не очень) хороший K & R C, могут помнить, что у pre-ansi C были только списки идентификаторов, и тип параметров не был явно объявлен. В те дни нам приходилось явно приводить параметры, а когда мы забывали, у нас не было предупреждений во время компиляции, но были ошибки во время выполнения.
Способ точного перевода приведения и вызова на языке ассемблера или машинной инструкции является лишь деталью реализации. Важно то, что все должно происходить так, как если бы компилятор объявил временную переменную uint32_t
, принудительно ввел значение uint8_t
во временную и передал временную функцию. Но оптимизирующие компиляторы часто используют регистр для передачи одного целочисленного параметра. В зависимости от процессора, он может обнулить аккумулятор, загрузить одиночный байт в младшие биты и вызвать функцию.