From the C# draft specification on integer division:
If the left operand is the smallest representable int
or long
value and the right operand is -1
, an overflow occurs. In a checked
context, this causes a System.ArithmeticException
(or a subclass thereof) to be thrown. In an unchecked
context, it is implementation-defined as to whether a System.ArithmeticException
(or a subclass thereof) is thrown or the overflow goes unreported with the resulting value being that of the left operand.
I'm not sure where Microsoft lists its choices for implementation-defined behavior, but apparently they chose the first option here.
This and other implementation-defined or undefined behavior is listed in Annex B of ECMA-334.
The draft specification above is updated more recently, but it seems to lack this annex.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…