補足です。

別に
(4バイトの何らかの型) a;
WORD low, high;
low = a; //下位ワード
high = (a >> 16); //上位ワード;

でいいのでは?と思ったのですが、
なぜ

(4バイトの何らかの型) a;
WORD low, high;
low = a & $FFFF; // ← low = a & 0xFFFF;の誤植??あとANDしても結果は変わらないと思うのになぜマスクしている?
high = (a >> 16) & $FFFF; // ← high = a & 0xFFFF;の誤植??あと、ANDしても結果は変わらないと思うのになぜマスクしている?

にしているのでしょうか?ということです。