I campi MaxValue e MinValue forniti dal tipo System.Int32 sono due costanti, definite rispettivamente 0x7fffffff (0 seguito da 31 1) e 0x80000000 (1 seguito da 31 0), cioè l'uno è il complemento binario dell'altro.
public struct Int32 //...
{
public const int MaxValue = 0x7fffffff;
public const int MinValue = unchecked((int)0x80000000);
//...
}
L'operatore unchecked si deve al fatto che la costante hexadecimale 0x80000000 è del tipo uint (Pow(2, 31)) e il cast ad un int produce overflow (Pow(2, 31) > MaxValue). Questi valori spiegano l'osservazione di M.rkino che Int32.MinValue = -Int32.MinValue.
Vediamo qui di seguito come:
Abbiamo:
MinValue = -Pow(2, 31)
MaxValue = Pow(2, 31) - 1
MaxValue + 1 = MinValue
Possiamo quindi scrivere:
MinValue = -Pow(2, 31) = -Pow(2, 31) + 1 - 1 = -(Pow(2, 31) - 1) - 1 = -MaxValue - 1 = -(MaxValue + 1) = -MinValue
Cioè MinValue = -MinValue.