Bài viết này cần thêm chú thích nguồn gốc để kiểm chứng thông tin. |
Bù 2 (tiếng Anh: two's complement) là một số trong hệ nhị phân là bù đúng (true complement) của một số khác. Một số bù 2 có được do đảo tất cả các bit có trong số nhị phân (đổi 1 thành 0 và ngược lại) rồi thêm 1 vào kết quả vừa đạt được. Thực chất, số biểu diễn ở dạng bù 2 là số biểu diễn ở bù 1 rồi sau đó cộng thêm 1. Trong quá trình tính toán bằng tay cho nhanh người ta thường sử dụng cách sau: bắt đầu từ số nhị phân của số dương cần lấy âm, từ phải qua trái giữ 1 đầu tiên và các số còn lại bên trái số 1 lấy đảo lại (chỉ áp dụng cho số có bit cực phải là 1).
Phương pháp bù 2 thường được sử dụng để biểu diễn số âm trong máy tính. Theo phương pháp này, bit cực trái (là bit nằm bên trái cùng của byte) được sử dụng làm bit dấu (sign bit - là bit tượng trưng cho dấu của số) với quy ước: nếu bit dấu là 0 thì số là số dương, còn nếu nó là 1 thì số là số âm. Ngoài bit dấu này ra, các bit còn lại được dùng để biểu diễn độ lớn của số.
Ví dụ: số nguyên −5 ở hệ thập phân được biểu diễn trong máy tính theo phương pháp bù 2 như sau (với mẫu 8 bit):
Ngoài cách làm theo định nghĩa như trên ra, ta còn có thể áp dụng phương pháp bù 2 theo quy tắc sau: với biểu diễn nhị phân của một số dương cho trước, để biểu diễn số âm tương ứng, ta bắt đầu tìm từ phải sang trái cho đến khi gặp bit đầu tiên có giá trị 1. Khi gặp được bit này, ta đảo tất cả các bit từ ngay kề trước nó (tức trước bit có giá trị 1 vừa nói tới) cho đến bit cực trái, và luôn nhớ: bit cực trái là 1.
Ví dụ: ta cũng biểu diễn lại số nguyên −5 ở hệ thập phân sang hệ nhị phân theo quy tắc mới này (giả sử với mẫu 8 bit):
Khi thực hiện phép tính cộng với số âm biểu diễn theo phương pháp bù 2, ta thực hiện như phép cộng nhị phân bình thường, tuy nhiên, trong trường hợp khi đã thực hiện phép cộng đến bit cực trái mà vẫn phát sinh bit nhớ thì ta bỏ bit nhớ này đi.
Ví dụ:
1. Cộng hai số thập phân −5 với 2 (mẫu 8 bit):
1111 1011 (số bù 2 của −5) + 0000 0010 (số 2 ở hệ nhị phân) =========== 1111 1101 (số bù 2 của −3)
2. Cộng hai số thập phân −5 với −7 (mẫu 8 bit):
1111 1011 (số bù 2 của −5) + 1111 1001 (số bù 2 của −7) =========== 1111 0100 (số bù 2 của −12)
Ta thấy: khi cộng hai bit cực trái của hai số 1111 1011 và 1111 1001, ta vẫn còn nhớ 1, tuy nhiên, trong kết quả và ta bỏ bit này đi.
Xét trường hợp ta đang có hai số âm −6 và −4 ở hệ thập phân. Biểu diễn nhị phân bằng phương pháp bù 2 với mẫu 4 bit của hai số trên lần lượt là 1010 và 1100. Giả sử, bây giờ, ta cần cộng hai số này.
Ta thực hiện phép cộng:
1010 (số bù 2 của −6) + 1100 (số bù 2 của −4) ====== 0110
Ta thấy, kết quả nhận được là 0110. Nếu đổi ra hệ thập phân, đây là số nguyên dương 6 chứ không phải −10 như mong đợi.
Vấn đề như trên được gọi là tràn số. Nó xảy ra khi ta lấy số lượng bit để biểu diễn quá ít (như trong ví dụ trên là mẫu 4 bit). Để có thêm thông tin về vấn đề này, xin xem bài tràn số.