2008-12-22 68 views
7

Ai đó có thể giải thích cho tôi nguyên nhân tràn trong biến a? Lưu ý rằng b lớn hơn a.Lỗi tràn C# lạ

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

-2147483648 
123456789
9223372036854775807 
Press any key to continue . . . 

Cảm ơn!

Trả lời

26

RHS là một int phép nhân vì mọi phần của biểu thức là int. Chỉ vì nó được gán cho một thời gian dài không có nghĩa là nó được thực hiện với số học dài.

Thay đổi nó để:

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

và nó sẽ làm việc. (Sự khác biệt là L ở cuối 1024 đầu tiên.)

+0

Có lẽ thời gian chạy có thể linh hoạt hơn và tự động "mở rộng" tính toán nếu nó thấy biểu thức đó sẽ được lưu trữ trong thời gian dài? –

+0

@Petar: Tôi nghĩ đó sẽ là một ý tưởng tồi. Nó sẽ làm cho ngôn ngữ phức tạp hơn nhiều. Thật dễ dàng để tránh vấn đề này và nó giữ ngôn ngữ đơn giản - có một vài nơi mà ý nghĩa của một biểu thức phụ thuộc vào ngữ cảnh của nó (ví dụ: biểu thức lambda) nhưng tôi không muốn thấy nhiều hơn. –