Hay un problemita con esas asignaciones y es el siguiente: El char como bien sabés ocupa 8 bits, y las variables que estás utilizando a la derecha son de 16 bits. C te permite hacer esto, pero luego achica el resultado, guardando únicamente los últimos 8 bits. Para el primera caso funciona bien, porque los gbits que querés conservar son los últimos 8. Para el segundo caso, a la variable dato se le asignará el valor 0. Deberías hacer un shift a la derecha de 8 lugares para que la asignación sea correcta:
char dato = (buffer[pdescarga] & 0xFF00) >> 8;
Saludos!