Почему возвращается 0? Он должен вывести 18446744073709551615, что должно соответствовать - PullRequest
1 голос
/ 10 июля 2020

Этот код возвращает 0, где он должен возвращать 18446744073709551615, что должно соответствовать ulong? Когда я устанавливаю 63 (а не 64) итерации, я получаю 9223372036854775808, что правильно.

public static ulong Total()
{
    ulong output = 1ul ; 
    for(var x = 0; x < 64; x++)
    {
        output *= 2;
    }
    return output;
}

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Вы вычисляете 2 ^ 64, что не 18446744073709551615, а 1844674407370955161 6 . Вы можете заметить, что когда вы изменили 64 на 63, вы получили 9223372036854775808, а не 9223372036854775807.

2 голосов
/ 10 июля 2020

Расчет, который вы делаете, выходит за рамки количества байтов ulong, необходимого для содержания большого значения ...

https://docs.microsoft.com/dotnet/csharp/language-reference/builtin-types/integral-numeric-types

Вам нужно использовать десятичное число, например:

public static decimal Total()
{
  decimal output = 1ul;
  for ( var x = 0; x < 64; x++ )
  {
    output *= 2;
  }
  return output;
}

Этот вывод 18446744073709551616.

Действительно, если мы добавим ключевое слово checked в метод, используя ulong:

public static ulong Total()
{
  ulong output = 1ul;
  for ( var x = 0; x < 64; x++ )
  {
    output = checked(output * 2);
  }
  return output;
}

Мы получаем исключение переполнения.

Вы также можете использовать System.Numerics.BigInteger для очень больших целых чисел.

https://docs.microsoft.com/dotnet/api/system.numerics.biginteger

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...