dynamic typed language も untyped language の subset でしょう

untyped language というのは全ての値が型無しポインタのようなもの

*x = 2.25;
*y = sqrt(x);

sqrt(x) はポインタ x の指す先が double を表現するビット列だと思って動くだけ。
x の指す先が 2.25 を表現するビット列なら 1.5 というビット列を指すポインタが戻される。

*x = 'a';
*y = sqrt(x);

こう書いても、x の指す先に double を表すビット列が格納されていると思って、
ポインタ y が戻される。もちろん、この場合は y の指す先のビット列を double と思って解釈すれば
意味不明な数値になるだろうが、それは呼ぶ側の責任。呼ばれる側は知らない。

これが untyped な世界です

これじゃあいくら何でも・・・なので、
すべてのポインタの指す先に、型ごとに決められた特定のビットパターンを埋めることにして、
データ本体はそのパターンの後に書くことにしましょう。
関数側は、ビットパターンを検査することで、期待した値が渡されたかどうかはチェックできるようにしましょう。

これが動的型付けの世界。

型無しの世界は、あるビットパターンを int と思って解釈した時と double と思って解釈したときで
異なる挙動をするような曲芸的なプログラミングも可能です。
まあドカタは動的型付けでやってりゃいいです。