2015-02-06 4 views
1

следующие прекрасно работает без ошибок и diff является 1:Почему не возникает исключение переполнения?

int max = int.MaxValue; 
int min = int.MinValue; 
//Console.WriteLine("Min is {0} and max is {1}", min, max); 
int diff = min - max; 
Console.WriteLine(diff); 

Не было тогда все программы быть подозреваемым? не + б не больше сумма и б, где и б имеют тип int. Иногда бывает, но иногда это сумма * a, b и 2 * int.MinValue.

* Сумма, как и в обычном английском смысле того, игнорируя любое знание компьютера или размеру слова

В PowerShell, он выглядит лучше, но он по-прежнему не является аппаратным исключением из операции добавления. Оказывается, использовать long перед заливкой назад к int:

[int]$x = [int]::minvalue - [int]::maxvalue 
Cannot convert value "-4294967295" to type "System.Int32". Error: "Value was either too large or too small for an Int32." 

ответ

7

По умолчанию проверка переполнения отключена в C#. Ценности просто «обертываются» обычным способом.

Если вы скомпилировали тот же код с /checked или использовали блок checked { ... }, это создаст исключение.

В зависимости от того, что вы делаете, вам может потребоваться проверка или явно нет хочу этого. Например, в Noda Time у нас есть проверка переполнения по умолчанию, но явно отключить ее для вычислений GetHashCode (где мы ожидаем переполнения и не имеем с этим проблем), а вычисления, которые мы знаем , не будут переполняться и где мы Не нужно (очень слабое) снижение производительности при проверке переполнения.

Для получения дополнительной информации см. Страницы checked и unchecked в ссылке на C# или в разделе 7.6.12 спецификации языка C#.

+0

Архитектура iAPX не предлагает встроенную проверку переполнения для операции «Добавить»? –

+0

@OldGeezer: Я бы не хотел точно сказать, как это реализовано ниже - но неконтролируемая арифметика * очень немного быстрее в моем опыте. –

2

Если не указан, .NET не будет проверять числовое переполнение при выполнении операций над числовыми типами данных int и т.д.

Вы можете включить это либо здание в проверяемом режиме (передача /checked в аргументы компилятора), или use checked in a code segment:

checked 
{ 
    int i = int.MaxValue + int.MaxValue; 
    Console.WriteLine(i); 
} 
Смежные вопросы