Тут надо разделять число и параметр. Числа в АНК 64-битные, а параметр будет 32-битный, т.к. верхние 32 бита АНК отрежет при передаче числа. Если параметр 8-битный, он отрежет всё, что выше 8 бит. Мой код оперирует с числом, а не с параметром.
Здесь отрицательное 16-битное число упаковано в младшие 16 бит 64-битного числа и надо, чтобы при распаковке получилось отрицательное 64-битное число с тем же значением. Простое "& 0xFFFF" тут не годится, поскольку тогда все биты выше младших 16 будут нулями, а у отрицательного числа они должны быть все 1. Чтобы их заполнить единицами, и используются сдвиги. Сначала младшие 16 бит сдвигаются влево до упора (на 48 шагов), так чтобы старший бит 16-битного числа (1 у отрицательных) стал старшим битом 64-битного. Потом идёт сдвиг обратно вправо, и при этом освобождающиеся слева биты заполняются этим самым старшим битом. Это так называемый арифметический сдвиг, сохраняющий знак числа. Если бы 16-битное число было положительным, старший бит был бы 0 и освобождающиеся биты заполнились бы нулями. Конечно, для положительных чисел трюк со сдвигами не нужен, там достаточно "& 0xFFFF", но и вреда им от него не будет.