С# ulong переполнение / потеря значимости как-то разрешено

Меня немного смущает поведение типа ulong. Насколько я понимаю, это 64-битное целое число, используемое для положительные числа (максимальное значение – 18 446 744 073 709 551 615). Я только начал использовать его, потому что мне нужны действительно большие положительные числа, но есть какое-то странное поведение, которое я не понимаю, вокруг потенциальных отрицательных чисел.

ulong big = 1000000;    //Perfectly legal

ulong negative = -1;    //"Constant value "-1" cannot be converted to a ulong" Makes sense


//Attempt to sneak around the -1 as a constant compile-time error
int negativeInt = -1;
ulong negativeUlongFail = negativeInt;    //"Cannot implicitly convert 'int' to 'ulong'.
                                 //An explicit conversion exists (are you missing a cast?)"
//So I add casting
ulong negativeUlong = (ulong)negativeInt;    //But this yields 18446744073709551615

//Try and get a negative number indirectly
ulong number = 0;
number = number - 10;  //now number is 18446744073709551615 but no underflow error

Что происходит? Почему некоторые ошибки потери значимости перехватываются, а другие нет и даже не вызывают исключений? Могу ли я их обнаружить?

Я сосредоточился на получении отрицательных чисел путем переполнения, но я видел аналогичные вещи, когда получал числа больше максимального значения и переполнялся.

Я не уверен, являются ли они технически ошибками или исключениями, поэтому, пожалуйста, извините меня, если я использовал неправильную терминологию


person SleekPanther    schedule 23.07.2017    source источник
comment
В компиляторе по умолчанию включена проверка недостаточности/переполнения, а во время выполнения нет. Последний является настройкой проекта, «Проект» > «Свойства» > вкладка «Сборка» > кнопка «Дополнительно». Включение флажка является хорошей идеей для конфигурации отладки. Не так много для сборки Release, чек довольно дорогой. Переопределите эти значения по умолчанию на лету с помощью ключевых слов checked и unchecked.   -  person Hans Passant    schedule 24.07.2017


Ответы (1)


если вы хотите, чтобы было выбрано исключение недополнения (или переполнения), попробуйте вместо этого: -

checked
{
    ulong number = 0;
    number = number - 10;
}

по умолчанию исключение проглатывается (оно выполняется без проверки).

см. официальную документацию

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/checked

person Keith Nicholas    schedule 23.07.2017