If I were to instantiate an sbyte with 8 bits
This is your misconception - the literal 0b_1111_1111 does not represent "8 bits". Integer literals always numbers. 0b_1111_1111 represents the numerical value of 255, exactly the same value as the literal 255. You are effectively writing
sbyte test = 255;
255 is larger than sbyte.MaxValue (127), so this does not compile.
To write the numerical value of -1 using a binary integer literal, you can write
sbyte test = -0b1;
(sbyte)0b_1111_1111 also does not compile, because 0b_1111_1111 is a constant expression. Conversions involving constant expressions are checked by default. On the other hand, a variable name such as temp is not a constant expression, and conversions involving those are unchecked by default. From the spec:
For non-constant expressions (§12.23) (expressions that are evaluated at run-time) that are not enclosed by any checked or unchecked operators or statements, the default overflow checking context is unchecked, unless external factors (such as compiler switches and execution environment configuration) call for checked evaluation.
For constant expressions (§12.23) (expressions that can be fully evaluated at compile-time), the default overflow checking context is always checked. Unless a constant expression is explicitly placed in an unchecked context, overflows that occur during the compile-time evaluation of the expression always cause compile-time errors.
You can write
sbyte x = unchecked((sbyte)0b1111_1111);
like the spec suggests, or use CreateTruncating, which I find easier to read, though this incurs the overhead of calling a method.
sbyte x = sbyte.CreateTruncating(0b_1111_1111);