2010-05-29 53 views
33

Có chuyện gì với điều này? Tôi làm một phép nhân đơn giản:Điều này có gây ra tràn không? Nó không!

Int64 x = 11111111111; 
Int64 y = 11111111111; 
Int64 z = x * y; 

Và ở phần cuối của các nhân, z hiển thị giá trị:

-5670418394979206991

này đã tràn rõ ràng, nhưng không có ngoại lệ xảy ra. Tôi muốn một người được nêu ra, nhưng ...

Lưu ý rằng đây là trên Windows Phone 7, nhưng tôi không nghĩ rằng điều này có bất kỳ mang về vấn đề này. Hay không?

Trả lời

43

Bạn có thể sử dụng một khối kiểm tra như đã chỉ ra đã được câu trả lời khác:

checked 
{ 
    long x = 11111111111; 
    long y = 11111111111; 
    long z = checked(x * y); 
    // ... 
} 

mà kết quả trong một ngoại lệ:

OverflowException: hoạt động số học dẫn đến sự tràn.

Nếu bạn chỉ làm một thao tác đơn giản mà bạn cần kiểm tra bạn có thể sử dụng một checked expression thay vì:

long x = 11111111111; 
long y = 11111111111; 
long z = checked(x * y); 

Bạn cũng có thể thiết lập các /checked compiler option có mặc định được kiểm tra.

Để thiết lập tùy chọn trình biên dịch này trong môi trường phát triển Visual Studio:

  1. mở hộp thoại Trang Sở hữu của dự án. Để biết chi tiết, hãy xem Setting Visual C# Project Properties.
  2. Nhấp vào Thuộc tính cấu hình thư mục.
  3. Nhấp vào trang Xây dựng.
  4. Sửa đổi số Kiểm tra thuộc tính tràn/tính toán số học.

Nếu bạn thay đổi mặc định thành đã chọn, bạn có thể sử dụng các khối hoặc biểu thức không được kiểm tra để thực hiện lại hành vi không được kiểm tra.

+25

Lưu ý rằng lý do mà không được kiểm tra là mặc định là bởi vì (1) 99% số học số nguyên thời gian là hư không gần ranh giới, và (2) số học được kiểm tra là WAY chậm hơn. Đây là một trong những trường hợp hiếm hoi mà thiết kế của C# chọn nguy hiểm theo mặc định vì lý do hiệu suất. –

+0

Máy x86 sử dụng một jno đơn giản, dự đoán nhánh luôn tốt, không thể tốn nhiều hơn một chu kỳ. –

+0

Không phải là nó nhất thiết phải liên quan đến thiết kế của C# nhưng trong trường hợp cụ thể này chúng ta đang nói về ARM. Các hành vi của jitter x86 là hơi học tập – Stewart

26

Check it:

checked 
{ 
    Int64 x = 11111111111; 
    Int64 y = 11111111111; 
    Int64 z = x * y; 
} 
+6

Bingo! Tìm hiểu một cái gì đó mới mỗi ngày, tôi làm! Cảm ơn. Và cảm ơn lòng tốt cho SO. – Cyberherbalist

8

Hãy thử:

checked 
{ 
    Int64 x = 11111111111; 
    Int64 y = 11111111111; 
    Int64 z = x * y; 
} 
8

Compiler giả sử bạn muốn làm điều đó theo cách đó và tiến hành các Overflow. Nếu tràn cần phải được coi là ngoại lệ cho hoạt động, quấn hoạt động xung quanh checked và nó sẽ ném một ngoại lệ khi chạy.

checked 
{ 
    Int64 x = 11111111111; 
    Int64 y = 11111111111; 
    Int64 z = x * y; 
} 

System.OverflowException: Một ngoại lệ loại System.OverflowException là ném.

Các vấn đề liên quan