1

此代码返回 0,它应该返回 18446744073709551615,它应该适合 ulong?当我将其设置为迭代 63 次(而不是 64 次)时,我得到 9223372036854775808,这是正确的。

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

2 回答 2

3

您正在计算 2^64,它不是 18446744073709551615 而是 1844674407370955161 6。您可能会注意到,当您将 64 更改为 63 时,您得到的是 9223372036854775808 而不是 9223372036854775807。

于 2020-07-10T13:51:32.670 回答
2

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

于 2020-07-10T14:14:52.680 回答