2015-11-25 20 views
5

Trong 7.8.3. của C# Thông số kỹ thuật liên quan đến việc điều hành còn lại nó khẳng định như sau:Tại sao int.MinValue% -1 gây ra và tràn ngoại lệ

Nếu toán hạng bên trái là int nhỏ nhất hoặc giá trị lâu dài và quyền toán hạng là -1, một System.OverflowException được ném.

Do đó int.MinValue % -1 sẽ dẫn đến Lỗi ngoại lệ. Tôi đang cố hiểu tại sao?

+0

Lưu ý rằng trong Java, kết quả là '0' theo thông số kỹ thuật và trong C thao tác gọi hành vi không xác định. – ouah

Trả lời

6

Trong số học bổ sung của hai, kiểu dữ liệu có phạm vi từ (-2 ** n) đến (2 ** n - 1) (trong đó 'n' nhỏ hơn 1 số bit trong kiểu dữ liệu). Ví dụ, số nguyên 16 bit có ký hiệu có phạm vi hợp lệ từ -32768 (-2 ** 15) đến 32767 (2 ** 15 - 1).

-32768/-1 = +32768 vượt quá phạm vi hợp lệ cho số nguyên có ký hiệu 16 bit.

+2

Về mặt toán học 'int.MinValue% -1' sẽ là 0, hoặc -1 (hoặc có thể 1). Điều này không vượt quá phạm vi hợp lệ cho số nguyên được ký 16 bit. – chux

+2

Nhưng nó thường được tính bằng cách chia đầu tiên sau đó tìm phần còn lại. – keithmo

+0

Đồng ý, nhưng đặc tả ngôn ngữ có yêu cầu thứ tự đó không? – chux

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