Сложение сил между переменной ulong и long - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующая функция:

long Foo (long min, long max)
{
    ulong range = max - min; // guaranteed to fit in ulong
    ulong x = GenerateRandomULongBetween0AndRange(range);
    return x + min; // result is guaranteed to fit in long
}

Но компилятор C # говорит, что я не могу добавить ulong и long.x может быть больше long.MaxValue, а min может быть отрицательным.Так что я не могу бросить одно на другое.Как действовать?: - (

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Компилятор C # говорит, что я не могу добавить ulong и long.

Правильно.

x может быть больше, чем long.MaxValue, хотя min можетбыть отрицательным

Правильно.

Так что я не могу привести одно к другому.

Неверно.Брось их.Посмотрите, что происходит!Вы можете быть приятно удивлены.

Длинная / длинная арифметика не отличается;битовые шаблоны абсолютно одинаковы и компилируются в один и тот же код.Это просто интерпретация битов, которые отличаются.

Одно слово предупреждения: можно перевести C # в режим, в котором происходит сбой при переполнении, включающем целочисленную арифметику, и выявно не хочу, чтобы здесь произошел сбой.Вы можете убедиться, что этого не произойдет, даже если кто-то включит «отмечен по умолчанию», используя функцию unchecked в форме выражения или оператора.

0 голосов
/ 21 сентября 2018
learn casting 
example
ulong min=2;
ulong range = 12 - 2; // guaranteed to fit in ulong
ulong x = (ulong) range;
long we=  (long)x +(long) min;

    long.MinValue = -9223372036854775808
    long.MaxValue =  9223372036854775807
    18446744073709551615 <-- Max ulong
    0                    <-- Minulong

long can be negative and positive both.

    long range = long.MaxValue - 0; // guaranteed to fit in 
    long x = GenerateRandomLongBetween0AndRange(range);
`x= Math.Abs(x ) to get positive values if you are using long` for that.

Even your function is  ok  just change signature here

    long Foo (long min, long max)
    {
        ulong range = max - min; // guaranteed to fit in long
        ulong x = GenerateRandomULongBetween0AndRange(range);
        return (long) x +(long) min; // result is guaranteed to fit in long
    }
...