C#中的长变量,为什么在超过限制时会返回负值

Jua*_*.S. 0 c# long-integer

我提出了一个解决阶乘的应用程序,当我输入一个长度超过20位数的long变量时,它会返回一个负数.我想知道为什么longC#中的变量在超过限制时会返回负值?它应该是这样的吗?

Hen*_*man 11

这是非常正常的行为,称为溢出.

作为第一步,将其变为错误

checked
{
    // your calculations
}
Run Code Online (Sandbox Code Playgroud)

这本书与所有的比特和字节一个详尽的解释.


这可能有助于搞清楚:

static void Main2(string[] args)
{
    short s = 0;
    Console.WriteLine("Dec: {0,6} Hex {0:X4}", s);
    s -= 1;
    Console.WriteLine("Dec: {0,6} Hex {0:X4}", s);

    s = short.MaxValue;
    Console.WriteLine("Dec: {0,6} Hex {0:X4}", s);
    s += 1;
    Console.WriteLine("Dec: {0,6} Hex {0:X4}", s);
    Console.WriteLine(s == short.MinValue);    // is MaxValue+1 == MinValue ?
}
Run Code Online (Sandbox Code Playgroud)

它打印

Dec:      0 Hex 0000
Dec:     -1 Hex FFFF
Dec:  32767 Hex 7FFF
Dec: -32768 Hex 8000
True
Run Code Online (Sandbox Code Playgroud)

将Hex char读取为位:

0 = 0000
1 = 0001
7 = 0111
8 = 1000
F = 1111
Run Code Online (Sandbox Code Playgroud)

您可以看到最重要(最左侧)位用作+/-符号.