奇怪的c#溢出错误

奇怪的c#溢出错误,c#,overflow,long-integer,C#,Overflow,Long Integer,有人能解释一下变量a溢出的原因吗?注意,b比a大 static void Main(string[] args) { int i = 2; long a = 1024 * 1024 * 1024 * i; long b = 12345678901234567; System.Console.WriteLine("{0}", a); System.Console.WriteLine("{0}", b); System.Consol

有人能解释一下变量a溢出的原因吗?注意,b比a大

static void Main(string[] args)
{
     int i = 2;    
     long a = 1024 * 1024 * 1024 * i;
     long b = 12345678901234567;
     System.Console.WriteLine("{0}", a);
     System.Console.WriteLine("{0}", b);
     System.Console.WriteLine("{0}", long.MaxValue);
}

-2147483648
 12345678901234567
 9223372036854775807
 Press any key to continue . . .
谢谢

RHS是一个整数乘法,因为表达式的每一部分都是一个整数。仅仅因为它被分配给一个long,并不意味着它是用long算术执行的

将其更改为:

long a = 1024L * 1024 * 1024 * i;

它会起作用的。(区别是第一个1024结尾的L。)

如果运行时看到表达式将以长格式存储,那么它可能会更灵活,并自动“扩展”计算?@Petar:我认为这是个坏主意。这将使语言更加复杂。很容易避免这个问题,而且它保持了语言的简单性——在一些地方,表达式的含义取决于其上下文(例如lambda表达式),但我不想看到更多。