Máy tính bù 2 là gì?
Máy tính bù 2 (two's complement) giúp bạn chuyển đổi số giữa hệ thập phân, nhị phân và thập lục phân, đồng thời cho thấy máy tính biểu diễn các giá trị âm như thế nào. Bù 2 là phương pháp tiêu chuẩn mà gần như mọi vi xử lý hiện đại dùng để lưu số nguyên có dấu, vì vậy nắm vững nó là điều bắt buộc với lập trình viên, sinh viên điện tử và bất kỳ ai làm việc với logic số. Công cụ này cho phép bạn nhập số ở bất kỳ hệ cơ số nào, chọn độ rộng bit (8, 16 hoặc 32 bit) và xem ngay cách biểu diễn bù 2 cùng giá trị thập phân tương ứng.
Cách sử dụng máy tính
- Nhập số vào ô nhập liệu — chấp nhận hệ thập phân, nhị phân hoặc thập lục phân.
- Chọn hệ cơ số của số đầu vào nếu cần.
- Chọn độ rộng bit: 8 bit, 16 bit hoặc 32 bit.
- Xem kết quả: giá trị nhị phân, hex và thập phân có dấu sẽ hiện ra tự động.
Độ rộng bit rất quan trọng vì nó quyết định khoảng giá trị có thể lưu trữ. Ví dụ, số nguyên có dấu 8 bit chứa được các giá trị từ -128 đến 127, còn số 16 bit trải dài từ -32.768 đến 32.767.
Giải thích công thức
Để tìm bù 2 của một số nhị phân, bạn thực hiện hai bước:
- Đảo tất cả các bit (đổi mỗi 0 thành 1 và mỗi 1 thành 0). Đây chính là bù 1.
- Cộng thêm 1 vào kết quả vừa nhận được.
Công thức tổng quát:
$$\text{Twos Complement} = \left(\sim \text{Number}_{\,2}\right) + 1 \pmod{2^{\text{Bit Width}}}$$Bit ngoài cùng bên trái đóng vai trò bit dấu: 0 nghĩa là dương, 1 nghĩa là âm. Để chuyển một số thập phân âm sang bù 2, áp dụng công thức \(2^{n} + \text{giá trị}\), trong đó \(n\) là độ rộng bit.
Ví dụ minh họa
Chuyển -5 sang bù 2 dạng 8 bit:
- Bắt đầu với +5 ở dạng nhị phân:
0000 0101. - Đảo các bit:
1111 1010. - Cộng 1:
1111 1011.
Như vậy -5 được lưu thành 1111 1011, tương đương FB trong hệ thập lục phân. Kiểm tra lại: \(251 - 256 = -5\) (251 là giá trị không dấu).
Phạm vi số nguyên có dấu theo độ rộng bit
Phần bù hai là cách tiêu chuẩn mà máy tính biểu diễn các số nguyên có dấu. Với độ rộng bit \(n\) cho trước, một bit hoạt động như bit dấu, vì vậy phạm vi có dấu có thể biểu diễn là \(-2^{n-1}\) đến \(2^{n-1}-1\), trong khi cách diễn giải không dấu của các bit tương tự bao phủ \(0\) đến \(2^{n}-1\). Tất cả phép tính số học được cuốn modulo \(2^{n}\).
| Độ rộng bit \(n\) | Tối thiểu có dấu \(-2^{n-1}\) | Tối đa có dấu \(2^{n-1}-1\) | Tối đa không dấu \(2^{n}-1\) | Modulus \(2^{n}\) |
|---|---|---|---|---|
| 8 | -128 | 127 | 255 | 256 |
| 16 | -32,768 | 32,767 | 65,535 | 65,536 |
| 32 | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 | 4,294,967,296 |
| 64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 18,446,744,073,709,551,615 | 18,446,744,073,709,551,616 |
Ví dụ: phần bù hai của số thập phân 5 ở dạng 8-bit là 251 khi được đọc dưới dạng byte không dấu, điều này biểu diễn \(-5\) như một giá trị có dấu.
Tham chiếu thập phân – nhị phân – Hex cho các giá trị 8-bit thông thường
Bảng sau ánh xạ các giá trị thập phân có dấu tiêu biểu với các dạng nhị phân phần bù hai 8-bit và hex của chúng. Các số âm có bit có ý nghĩa nhất được đặt thành 1. Để phủ định một giá trị, đảo ngược tất cả 8 bit và thêm 1.
| Thập phân có dấu | Nhị phân 8-bit | Hex | Giá trị không dấu |
|---|---|---|---|
| -128 | 1000 0000 | 0x80 | 128 |
| -64 | 1100 0000 | 0xC0 | 192 |
| -5 | 1111 1011 | 0xFB | 251 |
| -1 | 1111 1111 | 0xFF | 255 |
| 0 | 0000 0000 | 0x00 | 0 |
| 1 | 0000 0001 | 0x01 | 1 |
| 5 | 0000 0101 | 0x05 | 5 |
| 64 | 0100 0000 | 0x40 | 64 |
| 127 | 0111 1111 | 0x7F | 127 |
Để xác minh một dạng nhị phân một cách độc lập, bạn có thể chuyển đổi mẫu 8-bit 11111011 trở lại số thập phân, bằng 251 dưới dạng byte không dấu (được diễn giải thành \(-5\) có dấu).
Các thuật ngữ chính & Định nghĩa
- Độ rộng bit
- Số lượng chữ số nhị phân được sử dụng để lưu trữ một số nguyên (thường là 8, 16, 32 hoặc 64). Nó xác định modulus \(2^{n}\) và do đó phạm vi các giá trị có thể biểu diễn.
- Bit dấu
- Bit duy nhất cho biết liệu một số có dấu có âm (1) hay không âm (0). Trong phần bù hai, nó là bit có thứ tự cao nhất.
- Bit có ý nghĩa nhất (MSB)
- Bit bên trái, có giá trị cao nhất trong một số nhị phân. Trong giá trị phần bù hai có dấu, MSB cũng hoạt động như bit dấu.
- Phần bù một
- Phép đảo ngược từng bit của một số — mỗi 0 trở thành 1 và mỗi 1 trở thành 0 (\(\overline{B}\)). Nó là bước trung gian trước khi thêm 1 để tạo thành phần bù hai.
- Phần bù hai
- Mã hóa số nguyên có dấu chiếm ưu thế: phủ định một giá trị bằng cách đảo ngược tất cả các bit và thêm 1, tức là \(\overline{B}+1 \pmod{2^{n}}\). Nó cung cấp một biểu diễn duy nhất của không và cho phép phần cứng tương tự cộng các số có dấu và không dấu.
- Tràn / cuốn lại
- Điều xảy ra khi một kết quả vượt quá phạm vi có thể biểu diễn cho độ rộng bit; giá trị cuốn lại modulo \(2^{n}\). Ví dụ: cộng 1 vào giá trị tối đa 8-bit là 127 cuốn về -128.
- Số nguyên có dấu vs không dấu
- Một số nguyên có dấu có thể biểu diễn các số âm bằng cách sử dụng phần bù hai (phạm vi \(-2^{n-1}\) đến \(2^{n-1}-1\)); một số nguyên không dấu coi mỗi mẫu bit là không âm (phạm vi \(0\) đến \(2^{n}-1\)). Các bit giống hệt nhau — chỉ cách diễn giải khác nhau.
Câu hỏi thường gặp
Vì sao máy tính dùng bù 2? Vì nó cho phép phép cộng và phép trừ dùng chung một mạch điện, và chỉ có một cách biểu diễn duy nhất cho số 0, khác với phương pháp dấu-độ lớn hay bù 1.
Điều gì xảy ra nếu số quá lớn so với độ rộng bit? Giá trị sẽ tràn và quay vòng (overflow), cho ra kết quả ngoài ý muốn. Hãy chọn độ rộng bit lớn hơn để tránh tình trạng này.
Làm sao để chuyển ngược về số thập phân thông thường? Nếu bit dấu là 1, hãy lấy bù 2 một lần nữa rồi thêm dấu trừ; nếu bit dấu là 0, chỉ cần đọc nó như một số nhị phân bình thường.