[c#] Почему int.MaxValue - int.MinValue = -1?



Answers

Это происходит из-за проверки переполнения кода во время компиляции. Линия

Console.WriteLine(int.MaxValue - int.MinValue);

на самом деле не будет ошибкой во время выполнения, просто написать «-1», но из-за проверки переполнения вы получите ошибку компиляции «Операция переполняется во время компиляции в режиме проверки».

Чтобы обойти проверку переполнения времени компиляции в этом случае, вы можете:

         unchecked
        {
            Console.WriteLine(int.MaxValue - int.MinValue);                
        }

Что будет нормально работать и вывести «-1»,

Question

Насколько я понимаю, это должно привести к ошибке переполнения и когда я напишу вот так:

public static void Main()
{

    Console.WriteLine(int.MaxValue - int.MinValue);
}

он корректно дает мне ошибку переполнения.

Однако:

public static void Main()
{

    Console.WriteLine(test());
}

public static Int32 test(int minimum = int.MinValue, int maximum = int.MaxValue)
{
    return maximum - minimum;
}

будет выводиться -1 Почему это делается? Это должно вызвать ошибку, потому что ее явно переполнение!




Я думаю, что это происходит даже дальше, чем переполнение.

если я посмотрю на это

 Int64 max = Int32.MaxValue;
 Console.WriteLine(max.ToString("X16")); // 000000007FFFFFFF
 Int64 min = Int32.MinValue;
 Console.WriteLine(min.ToString("X")); //FFFFFFFF80000000
 Int64 subtract = max - min;
 Console.WriteLine(subtract.ToString("X16")); //00000000FFFFFFFF <- not an overflow since it's a 64 bit number
 Int32 neg = -1
 Console.WriteLine(neg.ToString("X")); //FFFFFFFF

Здесь вы видите, что если вы просто вычтите шестнадцатеричные значения) в дополнении 2 вы получите число -1 в 32-битном номере. (после транкинга ведущих 0

Арифметика дополнения 2 может быть очень забавной http://en.wikipedia.org/wiki/Two 's_complement




Links



Tags

c# c#