hung-doan / .bookmarks

My life bookmarker
0 stars 0 forks source link

C# .NET data overflow, integer max value #65

Open hung-doan opened 5 years ago

hung-doan commented 5 years ago

MAX_VALUE + 1 = -2147483648 MIN_VALUE = -2147483648 có nghĩa là MAX_VALUE + 1 = MIN_VALUE


Cái kết quả đi vòng thì do hệ quả do sử dụng hệ thống two component để biểu diễn giá trị nhị phân thôi à.

Còn cái chính là do nó xử lý data overflow . Đối với spec của C# thì khi xảy ra overflow thì nó sẽ bỏ đi những bit dữ ở bit cao hơn (bit cuối cùng bên trái)

Nguyên văn nó là như vầy: "In a checked context, if the sum is outside the range of the result type, a System.OverflowException is thrown. In an unchecked context, overflows are not reported and any significant high-order bits outside the range of the result type are discarded." https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-334.pdf

Nếu đặt đoạn MAX_VALUE + 1 trong checked {} thì nó sẽ báo exception, nếu không thì nó cứ discard bit dư thôi.

Vd: MAX_VALUE ở bit sẽ có dạng: 0111 1111 1111 1111 1111 1111 1111 1111 (bit đầu là dấu, 31 bit sau chứa giá trị) Khi cộng thêm 1 tức là 0111 1111 1111 1111 1111 1111 1111 1111 + 0000 0000 0000 0000 0000 0000 0000 0001

1000 0000 0000 0000 0000 0000 0000 0000

Để ý thì lúc này phần value (phần bit 1) nhảy từ 31 bit lên 32 bit.

Vì kểu int chỉ có 31 bit để biểu diễn giá trị nên lúc này nó sẽ hiển thị 32 bit ở trên là -2147483648 Nếu cast sang kiểu long thì kết quả sẽ là 2147483648 như mình muốn.