при статической типизации ты точно знаешь тип переменной в момент написания программы и разработки алгоритма и учитываешь это. т.е. если ты сказал, что переменная G является четырёхбатовым беззнаковым целым, то в алгоритме она всегда будет именно четырёхбайтовым беззнаковым целым (если что, то нужно её явно преобразовывать или знать как транслятор её преобразовывает в определённом круге ситуаций, но в основном если будет несовпадение типов это является ошибкой алгоритма, и компилятор тебя как минимум предупредит), при статической ты никак не можешь положить в число строку "вася-дурак" и дополнительные проверки перед использованием переменной на то "а число ли там" - не требуются, всю корректность данных ты проводишь в момент их ввода в программу или по мере требований самого алгоритма.
при динамической типизации, тип одной и той же переменной в общем случае тебе не известен и может меняться уже в процессе исполнения программы, и ты учитываешь это, никто тебя не предупредит о потенциальной ошибке алгоритма по причине несоответствия типа(ты разрабатывая алгоритм предполагал, что в G лежит целое, а пользователь ввёл скажем число с плавающей запятой, или того хуже, строку, или скажем после арифметического действия там вместо целого оказалось число с плавающей запятой, а ты на следующем шаге попытаешься использовать битовые операции...), с другой стороны многими мелочами можно не заморачиваться.
на низком уровне динамическая типизация просто скрывает от программиста, что каждая его переменная, фактически, представляется структурой с полем "тип переменной" и поле "данные"(которые в том числе могут быть указателем на область памяти), и в момент работы под интерпретатором с данными переменных идёт постоянная обработка соответственно полю "тип"(которое в некоторых случаях само может меняться). проблемы тормозов снижают жид компиляция и прочие оптимизации, а также использование готовых библиотечных функций.