j
Giá trị của là gì?
Int32 i = Int32.MinValue;
Int32 j = -i;
Biên dịch trong ngữ cảnh được kiểm tra sẽ đưa ra một ngoại lệ.
Không cần kiểm tra, chúng tôi nhận được giá trị Int32.MinValue
.
Nhưng tại sao lại như vậy?
Dưới đây là các giá trị Int32 tối thiểu và tối đa:
Dec Bin (bit đầu tiên là bit dấu)
Int32.MinValue -2147483648 10000000000000000000000000000000000
Int32.MaxValue 2147483647 01111111111111111111111111111111
Khi bạn cố gắng vượt qua kiểm tra tràn rõ ràng -(-2147483648)
, trong trường hợp đó bạn sẽ gặp phải một ngoại lệ vì 2147483648
Lớn hơn giá trị tối đa được phép của loại int.
Vậy tại sao bạn nhận được MinValue khi cho phép tràn? Bởi vì khi Int32.MinValue bị phủ định bạn có 2147483648
nó có biểu diễn nhị phân 10000000000000000000000000000000
Nhưng bit đầu tiên của số nguyên có dấu là bit dấu, do đó bạn nhận được giá trị Int32.Min chính xác.
Vì vậy, vấn đề ở đây là sử dụng bit đầu tiên làm ký hiệu số. Nếu bạn gán kết quả của giá trị Int32.Min bị phủ định cho một số nguyên không dấu, bạn sẽ nhận được kết quả như mong đợi 2147483648
giá trị:
Int32 i = Int32.MinValue;
UInt32 j = (UInt32)-i; // nó có 32 bit và không coi bit đầu tiên là dấu
Tôi là một lập trình viên xuất sắc, rất giỏi!