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.
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.