For the value to be u8, all operands of the expression need to be u8 as well. While the final value of this expression would fit into a u8, the expression 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 doesn't, which is why the compiler complains.
In other words, when directly assigning to a numerical variable of type T, the compiler will always infer that the type of every number in the expression of the assignment is of type Tunless the numbers are within parenthesis. Eg,
let a: usize = 2 + 6 * 8 / 9;
is equivalent to
let a: usize = 2usize + 6usize * 8usize / 9usize;
And because not all operations are done in the same cpu cycle (Unless you manage to parallelize it), the result of every arithmetical operation must fit in the numerical type T
The use of parenthesis is for precedent ordering so the as takes effect on the expression rather than the single item before it.
To begin with integers start with a type {integer}. The left hand side of the as operator does not have anything to specify the concrete type so the compiler uses i32. The right is obviously what it wants turning into but is not used to for any inference on the left. (The compiler is also free to make optimised machine code so it is entirely possible calculations are done beforehand and the types differ in assembly.)