Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么返回0?它应该输出18446744073709551615,这应该适合_C#_Ulong - Fatal编程技术网

C# 为什么返回0?它应该输出18446744073709551615,这应该适合

C# 为什么返回0?它应该输出18446744073709551615,这应该适合,c#,ulong,C#,Ulong,此代码返回0,其中应返回18446744073709551615,该值应适合ulong? 当我将其设置为迭代63次(而不是64次)时,我得到了9223372036854775808,这是正确的 public static ulong Total() { ulong output = 1ul ; for(var x = 0; x < 64; x++) { output *= 2; } return output; } public

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

public static ulong Total()
{
    ulong output = 1ul ; 
    for(var x = 0; x < 64; x++)
    {
        output *= 2;
    }
    return output;
}
public static ulong Total()
{
ulong输出=1ul;
对于(变量x=0;x<64;x++)
{
输出*=2;
}
返回输出;
}

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

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

您所做的计算超出了包含大值所需的
ulong
字节数的容量

您需要使用十进制,例如:

public静态十进制总计()
{
十进制输出=1ul;
对于(变量x=0;x<64;x++)
{
输出*=2;
}
返回输出;
}
此输出
18446744073709551616

实际上,如果我们使用
ulong
checked
关键字添加到方法中:

public static ulong Total()
{
ulong输出=1ul;
对于(变量x=0;x<64;x++)
{
输出=已检查(输出*2);
}
返回输出;
}
我们得到一个溢出异常

对于非常大的整数,也可以使用
System.Numerics.biginger


您所做的计算超出了包含大值所需的
ulong
字节数的容量

您需要使用十进制,例如:

public静态十进制总计()
{
十进制输出=1ul;
对于(变量x=0;x<64;x++)
{
输出*=2;
}
返回输出;
}
此输出
18446744073709551616

实际上,如果我们使用
ulong
checked
关键字添加到方法中:

public static ulong Total()
{
ulong输出=1ul;
对于(变量x=0;x<64;x++)
{
输出=已检查(输出*2);
}
返回输出;
}
我们得到一个溢出异常

对于非常大的整数,也可以使用
System.Numerics.biginger


不管其他任何事情,一旦你取了任何整数并将其乘以2,你应该会得到偶数结果,而不是奇数。你向左移动了1位64次。最后一次移位会将其移出64位值,实际上是将其删除。想想如果你在一个字节中将一个1位向左移动8次会发生什么。最后一次移位会将其移出字节。不管其他情况如何,一旦取了任何整数并将其乘以2,您应该会得到偶数结果,而不是奇数。您将1位64次向左移位。最后一次移位会将其移出64位值,实际上是将其删除。想想如果你在一个字节中将一个1位向左移动8次会发生什么。最后一个移位会将其移出字节。“而不是9223372036854775807”,这*2也不会导致18446744073709551615。这并没有解决主要问题,即“为什么返回0?”“而不是9223372036854775807”,这*2也不会导致18446744073709551615。这也没有解决主要问题,这是“为什么返回0?”