-1 * int.MinValue выдает ошибку - PullRequest
1 голос
/ 24 ноября 2011

Когда я пишу этот код

Console.WriteLine(-1 * int.MinValue);

или

int a = -1 * -2147483648;

Я получаю ошибку

Операция переполняется во время компиляции в проверенном режиме.

Есть ли проверка времени компиляции специально для этого значения? или он считает все написанные выражения в реальном времени?

Ответы [ 4 ]

9 голосов
/ 24 ноября 2011

Компилятор может выполнять (умножение) вычисление во время компиляции, а не во время выполнения, что он и делает.

Так как -1 * int.MinValue (-1 * -2 147 483 648, следовательно, 2 147 483 648) больше int.MaxValue (2 147 483 647) выдает ошибку компиляции.

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

Console.WriteLine(-2 * 1073741826);

, и вы получите то же поведение.

3 голосов
/ 24 ноября 2011

Нет необходимости в специальной проверке - значение естественно переполняется. Это как:

Console.WriteLine(int.MaxValue + 1);

Это явно переполняет int - и это то же значение, что и int.MinValue * -1.

Из раздела 7.19 спецификации C # 4:

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

3 голосов
/ 24 ноября 2011

Int (или, скорее, Int32) может содержать любое 32-битное целочисленное значение.Диапазон значений от -2147483648 до 2147483647.

-1 * -2147483648 = 2147483648. И это больше, чем максимальное значение Int32.Вот почему вы получаете переполнение.

Если вы хотите выполнить расчет, вы можете привести одно из значений к Int64.Так что это должно работать:

(Int64)(-1)*int.MinValue;
0 голосов
/ 24 ноября 2011

Есть проверки времени выполнения для значений.Значения int находятся в диапазоне от -21474048 до +21474047 (почему? 2 дополняет ).Таким образом, вы получите исключение.

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