2011-01-21 45 views
18

Tôi không thể hiểu được lỗi này:Thao tác số học dẫn đến tràn. (Thêm số nguyên)

Trong cuộc gọi này đến phương pháp setVolume, Khối lượng = 2055786000 và kích thước = 93552000. Khối lượng là một tài sản Integer, và kích thước cũng là Integer, như bạn có thể thấy.

Lớp này là một phần của lớp thực thể dbml, tuy nhiên thuộc tính Âm lượng này KHÔNG phải là một cột trong cơ sở dữ liệu, nó chỉ tồn tại trong lớp từng phần, dưới dạng "thuộc tính đối tượng nghiệp vụ".

Xem chi tiết show:

dữ liệu> Mục: Để đánh giá một tài sản được lập chỉ mục, tài sản phải có đủ điều kiện và các đối số phải được cung cấp một cách rõ ràng bởi người sử dụng.

alt text

Điều gì có thể gây ra điều này ...?

Trả lời

30

Giá trị lớn nhất của một số nguyên (được ký kết) là 2147483647. Nếu giá trị đó tràn, ngoại lệ sẽ được ném để ngăn chặn hành vi không mong muốn của chương trình của bạn.

Nếu ngoại lệ đó sẽ không được ném, bạn sẽ có giá trị là -2145629296 cho số Volume, điều này có thể không được mong muốn nhất.

Giải pháp: Sử dụng Int64 cho âm lượng của bạn. Với giá trị tối đa là 9223372036854775807, có thể bạn đang ở bên an toàn hơn.

+0

Tôi đã tạo tổng số 10.000 số tự nhiên đầu tiên khi tôi gặp phải lỗi này. Tôi đã sử dụng loại dữ liệu Int32 cho biến tổng kết. Khi tôi thay đổi nó thành Int64 thì vấn đề đã được giải quyết. Cảm ơn. Nó đã giúp đỡ! – RBT

7
int.MaxValue = 2147483647 
2055786000 + 93552000 = 2149338000 > int.MaxValue 

Vì vậy, bạn không thể lưu số này thành số nguyên. Bạn có thể sử dụng loại Int64 có giá trị tối đa là 9,223,372,036,854,775,807.

1

Giá trị tối đa fo int là 2147483647, vì vậy 2055786000 + 93.552.000> 2147483647 và nó gây ra tràn

2

Giá trị số nguyên kết quả nằm ngoài phạm vi mà loại dữ liệu số nguyên có thể giữ.

Hãy thử sử dụng Int64

0

2055786000 + 93552000 = 2149338000, mà là lớn hơn 2^31. Vì vậy, nếu bạn đang sử dụng các số nguyên đã ký được mã hóa trên 4 byte, kết quả của thao tác không phù hợp và bạn nhận được một ngoại lệ tràn.

0

Kích thước tối đa cho một int là 2147483647. Bạn có thể sử dụng Int64/Long lớn hơn rất nhiều.

3

byte Để đơn giản tôi sẽ sử dụng:

byte a=250; 
byte b=8; 
byte c=a+b; 

nếu a, b, và c là 'int', bạn mong chờ 258, nhưng trong trường hợp của 'byte', kết quả dự kiến ​​sẽ là 2 (258 & 0xFF), nhưng trong một ứng dụng Windows bạn nhận được một ngoại lệ, trong một giao diện điều khiển mà bạn có thể không (tôi không, nhưng điều này có thể phụ thuộc vào IDE, tôi sử dụng SharpDevelop).

Đôi khi, tuy nhiên, hành vi đó là mong muốn (ví dụ: bạn chỉ quan tâm đến 8 bit thấp hơn của kết quả).

Bạn có thể làm như sau:

byte a=250; 
byte b=8; 

byte c=(byte)((int)a + (int)b); 

Bằng cách này cả 'a' và 'b' được chuyển đổi thành 'int', thêm vào, sau đó đúc trở lại 'byte'.

Để được ở bên an toàn, bạn cũng có thể muốn thử:

... 
byte c=(byte)(((int)a + (int)b) & 0xFF); 

Hoặc nếu bạn thực sự muốn điều đó hành vi, cách đơn giản hơn nhiều cách làm ở trên là:

unchecked 
{ 
    byte a=250; 
    byte b=8; 
    byte c=a+b; 
} 

Hoặc khai báo biến của bạn trước, sau đó thực hiện phép toán trong phần 'không được kiểm tra'.

Cách khác, nếu bạn muốn bắt buộc kiểm tra tràn, thay vào đó hãy sử dụng 'đã chọn'.

Hy vọng điều này sẽ xóa mọi thứ.

Nurchi

P.S.

tin tưởng tôi, ngoại lệ mà là bạn của bạn :)

0

Lỗi này xảy ra đối với tôi khi một giá trị được trả về như # IND -1. Do một phép chia cho không. Thông tin Thông tin thêm về IEEE ngoại lệ floating-point trong C++ here on SOby John Cook

Đối với một trong những người đã downvoted câu trả lời này (và không nói rõ lý do tại sao), lý do tại sao câu trả lời này có thể có ý nghĩa đối với một số là một phép chia cho không sẽ dẫn đến một số lượng vô hạn và do đó một giá trị không phù hợp với Int32 (hoặc thậm chí là Int64). Vì vậy, lỗi bạn nhận được sẽ giống nhau (Thao tác số học dẫn đến tràn) nhưng lý do hơi khác.

+0

hãy chỉ rõ lý do tại sao câu trả lời này có một downvote –

+0

Tôi thực sự upvoted vì đây là thông tin tốt, nhưng tôi giả định downvote là vì tiêu đề nói "Thêm số nguyên", và bạn không thêm số nguyên. – DCShannon

+0

cảm ơn, và tất nhiên bạn đã đúng, đã không nhận thấy rằng một phần –

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