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