const expressions are resolved at compile-time, non-const expressions are resolved at runtime. Each have different types of overflow checking contexts by default. According to the C# specification:
For non-constant expressions (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.
Which is why you're not seeing a runtime error when you use local variables to do the arithmetic. As for the const calculation:
For constant expressions (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.
Which is why you're seeing a compile-time error with your const calculation.
More information about checked and unchecked on MSDN.