Уменьшение значения минимального int приводит к максимальному int - PullRequest
0 голосов
/ 09 августа 2011

Я сейчас читаю через C # 4.0 в двух словах, и в главе 2 говорится, что если объект int имеет значение int.MinValue (-2147483648) и значение уменьшается, так как значение не может быть ниже , это достигает самого высокого значения, int.MaxValue (2147483647):

int a = int.MinValue;
Console.WriteLine(a); //-2147483648
a = a-1;
Console.WriteLine(a); //-2147483648
Console.WriteLine (a == int.MaxValue);  // True

Далее в книге упоминается, как вы можете защитить себя от этого, используя checked.

Однако мне интересно, почему это возможно? Конечно, это может вызвать много проблем, если он не защищен с checked?

Разве это не недостаток в дизайне? Почему кто-то хочет, чтобы минимальное значение стало максимальным?


Кроме того, я заметил, что VB.NET выдаст «арифметическое переполнение» вместо того, чтобы это произошло:

Dim a As Integer
a = Integer.MaxValue
a = a + 1
Response.Write(a) 'Arithmetic overflow exception here

Ответы [ 3 ]

1 голос
/ 09 августа 2011

Иногда это желаемое поведение.В других случаях просто нет необходимости иметь дело с переполнениями и проверять их, поскольку они замедляют выполнение программы.Возьмите игровой рисунок без ограничений (FPS).При 1000FPS небольшая дополнительная проверка в 1 мс может оказать существенное влияние на частоту кадров.В других случаях это может быть ожидаемое выполнение (я видел только одно использование этого на сегодняшний день) - оно вытекает из того, что происходит в предке C # - C ++ и C.

Кроме того, обратите внимание, что поведение по умолчанию(checked или unchecked) варьируется в зависимости от конфигурации и среды:

Если ни проверено, ни снято, постоянное выражение использует проверку переполнения по умолчанию во время компиляции, которая проверяется.В противном случае, если выражение не является константой, проверка переполнения во время выполнения зависит от других факторов, таких как параметры компилятора и конфигурация среды.

Поскольку размещенный вами код является непостоянным (а также из-задля различных переменных среды), проверка на переполнение не выполняется.

1 голос
/ 09 августа 2011

Возможно, ваша программа автоматически проверит переполнение: щелкните правой кнопкой мыши файл проекта, выберите Build, затем нажмите кнопку Advanced в правом нижнем углу. В открывшемся окне установите флажок Check Arithmetical Overflow.

1 голос
/ 09 августа 2011

Это вопрос языкового дизайна - почему это происходит, связано с двоичным представлением чисел.В .NET это делается с помощью дополнения до двух , поэтому возникает проблема переполнения.

Разработчики VB.NET решили не допускать таких проблем переполнения / переполнения.

Разработчики C # решили оставить управление программисту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...