C# 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

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

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам