¿Por qué combinar dos turnos de uint8_t produce un resultado diferente?

¿Podría alguien explicarme por qué:

x = x << 1;
x = x >> 1;

y:

x = (x << 1) >> 1;

producir diferentes respuestas en C?x es un tipo * uint8_t * (entero largo de 1 byte sin signo). Por ejemplo cuando lo paso128 (10000000) en el primer caso vuelve0 (como se espera, el bit más significativo se cae) pero en el segundo caso devuelve el original128. ¿Porqué es eso? Espero que estas expresiones sean equivalentes?

Respuestas a la pregunta(2)

Su respuesta a la pregunta