You have a byte - 8 bit unsigned, its cast to int (always the case in C),
so you have a 32 bit int with all zeroes in the top 24.
Shifting left by 8 cannot set the sign bit.
If int were 16 bit it would already have the sign bit set.
So normally you'd do something like this:
int a = b0 | (b1 << 8) ;
a = a << 16 >> 16 ; // sign-extend
to get the sign bit set and propagated, or as you found:
short a = b0 | (b1 << 8) ;
[ note that casting a signed type to a wider signed type will automatically sign-extend,
short is signed, so when the result gets cast to (signed) int the sign extension happens]