Trước hết ta phải làm quen với một số khái niệm. Giả sử rằng ta đang xét kiểu dữ liệu Integer, sử dụng 2 ô nhớ liên tiếp để biểu diễn 1 số nguyên có dấu.
Hiện tượng tràn số.
Khi cộng hai số với nhau, mà kết quả vượt ra ngoài khả năng (số ô nhớ được sử dụng để) lưu trữ thì bit vượt ra ngoài sẽ bị chặt cụt. Ví dụ, phép cộng giữa hai số 1110 0101 0010 1110 và 1101 0010 1110 1101 sẽ cho ra kết quả là 1011 1000 0001 1011 (lẽ ra phải là 1 1011 1000 0001 1011). Số bù 1.
Bù 1 của x là một số được lấy bằng cách đảo tất cả các bit trong x. Ví dụ, bù 1 của số 0010 1101 1110 0110 sẽ là 1101 0010 0001 1001.
Số bù 2.
Bù 2 của x là một số được lấy bằng cách lấy bù 1 của x, rồi cộng thêm cho 1. Ví dụ, bù 2 của số 0010 1101 1110 0110 sẽ là 1101 0010 0001 1001 + 1 = 1101 0010 0001 1010.
Và cuối cùng là, số âm được lưu trữ trong máy tính dưới dạng bù 2 của phần giá trị. Ví dụ, giá trị Integer được lưu trữ trong máy tính dưới dạng 1011 1000 0001 1010. Thực vậy, bởi vì
152 − =1 32767 2 − =1 32767 11750= 11750 = 11750 −
nếu lấy 0010 1101 1110 0110 (11750) cộng với 1011 1000 0001 1010, ta sẽ nhận được kết quả là 0000 0000 0000 0000, tức 0 thập phân (kết quả của phép cộng này lẽ ra phải là 1 0000 0000 0000 0000, nhưng do hiện tượng tràn số xảy ra, nên bit 1 ngoài cùng bị bỏ đi).
Cũng với ví dụ trên, nếu ta tiếp tục lấy bù 2 của 1101 0010 0001 1010 ( ), ta sẽ nhận lại
được chính dãy số 0010 1101 1110 0110 ( ) ban đầu. Do đó, không cần phải chứng minh dài dòng, ta có thể tin rằng, trong máy tính, bù 2 của một số chính là số đối của nó.