Máy Tính Bù Hai Là Gì?
Bù hai (two's complement) là cách chuẩn mà máy tính dùng để biểu diễn số nguyên có dấu trong một số bit cố định. Công cụ này nhận một số thập phân cùng độ rộng thanh ghi n bit, rồi cho bạn thấy giá trị đó được lưu dưới dạng mẫu bit bù hai như thế nào, mẫu bit đó tương ứng với giá trị không dấu nào, và được diễn giải thành số có dấu ra sao. Công cụ hoạt động với cả số dương lẫn số âm.
Cách Sử Dụng
Nhập giá trị thập phân bạn muốn mã hóa và số bit (thường là 8, 16, 32). Máy tính sẽ gói giá trị vào thanh ghi n bit bằng phép chia lấy dư (modulo), hiển thị dạng nhị phân và giải mã ra giá trị có dấu. Với số âm, công cụ tự động lưu dưới dạng bù hai tương ứng.
Giải Thích Công Thức
Để lưu giá trị x trong n bit, mẫu bit (không dấu) được tính bằng
$$\text{stored} = \left(\left(x \bmod 2^{n}\right) + 2^{n}\right) \bmod 2^{n}$$Phần bù hai (phép lấy âm) của một giá trị đã lưu là
$$\text{twos} = \left(2^{n} - \text{stored}\right) \bmod 2^{n}$$Để giải mã ý nghĩa có dấu của một mẫu n bit: nếu mẫu lớn hơn hoặc bằng \(2^{n-1}\) thì giá trị là \(\text{pattern} - 2^{n}\) (số âm), ngược lại chính là giá trị của mẫu đó.
Ví Dụ Cụ Thể
Mã hóa -5 trong 8 bit. Ở đây \(2^8 = 256\), nên
$$\text{stored} = \left(\left(-5 \bmod 256\right) + 256\right) \bmod 256 = 251$$Đổi sang nhị phân: \(251 = 11111011\). Giải mã 251: vì \(251 \ge 2^7\) (128), giá trị có dấu là \(251 - 256 = -5\). Phần bù hai của 251 là \(\left(256 - 251\right) \bmod 256 = 5\), đúng bằng độ lớn của số.
Câu Hỏi Thường Gặp
Vì sao số âm lại hiện ra thành mẫu nhị phân toàn số lớn? Các bit đầu đều là 1; trong số học có dấu n bit, bit dẫn đầu bằng 1 đánh dấu một số âm, nên 11111011 là -5 chứ không phải 251.
n bit chứa được khoảng giá trị nào? Giá trị có dấu trải từ \(-2^{n-1}\) đến \(2^{n-1} - 1\). Với 8 bit, đó là từ -128 đến 127.
Nếu số của tôi quá lớn thì sao? Những giá trị vượt khỏi thanh ghi sẽ bị quấn vòng (tràn số) qua phép modulo, giống hệt như phần cứng thật.