此代码返回 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^64,它不是 18446744073709551615 而是 1844674407370955161 6。您可能会注意到,当您将 64 更改为 63 时,您得到的是 9223372036854775808 而不是 9223372036854775807。
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