Máy tính bù 2 là gì?
Bù 2 (two's complement) là cách chuẩn mà máy tính dùng để lưu các số nguyên có dấu. Công cụ này chuyển bất kỳ số thập phân nào sang dạng biểu diễn nhị phân bù 2 theo độ rộng bit bạn chọn (4, 8, 16 hoặc 32 bit), đồng thời hiển thị cả giá trị không dấu của chuỗi bit lẫn giá trị có dấu mà các bit đó đại diện.
Cách sử dụng
Nhập một số thập phân — dương hoặc âm — rồi chọn độ rộng bit. Công cụ sẽ lấy số đó theo modulo \(2^{n}\), tạo ra đúng chuỗi bit mà CPU thực sự lưu trữ. Nó cũng cho bạn biết chuỗi bit đó giải mã ra giá trị có dấu nào, nhờ vậy bạn có thể kiểm tra lại quá trình chuyển đổi qua lại.
Giải thích công thức
Với một trường n bit, giá trị không dấu được tính bằng \(u = ((x \bmod 2^{n}) + 2^{n}) \bmod 2^{n}\).
$$\text{Unsigned} = \left(\,\text{Decimal} \bmod 2^{\text{Bits}}\,\right),\qquad \text{Signed} = \begin{cases} \text{Unsigned} & \text{Unsigned} < 2^{\,\text{Bits}-1} \\[4pt] \text{Unsigned} - 2^{\text{Bits}} & \text{otherwise} \end{cases}$$Công thức này "cuộn" số âm vòng lại: trong 8 bit, −5 trở thành \(256 - 5 = 251\), có dạng nhị phân là 11111011. Để giải mã chuỗi bit ngược về giá trị có dấu, hãy xét bit cao nhất (MSB): nếu bit này bằng 1 (tức \(u \ge 2^{n-1}\)), giá trị là \(u - 2^{n}\); nếu không, giá trị đơn giản là \(u\). Một cách lấy số đối tương đương là đảo tất cả các bit rồi cộng thêm một: \(\sim x + 1\).
Ví dụ minh họa
Chuyển −5 sang bù 2 dạng 8 bit. Bước 1: \(2^{8} = 256\). Bước 2: \(u = ((-5 \bmod 256) + 256) \bmod 256 = 251\). Bước 3: 251 ở dạng nhị phân là 11111011. Vì MSB bằng 1 nên giá trị có dấu là \(251 - 256 = -5\), đúng với số ban đầu.
Câu hỏi thường gặp
Nếu số của tôi quá lớn so với độ rộng bit thì sao? Nó sẽ cuộn vòng (tràn) theo modulo \(2^{n}\), y hệt cách phần cứng xử lý. Ví dụ, 300 trong 8 bit trở thành \(300 - 256 = 44\).
Vì sao giá trị không dấu khác với giá trị có dấu? Cùng một chuỗi bit có thể được đọc theo hai cách. Cách không dấu coi mọi bit đều là dương; cách có dấu coi bit cao nhất mang trọng số âm.
Công cụ có hỗ trợ 64 bit không? Công cụ này hỗ trợ tới các độ rộng phổ biến 32 bit nhằm giữ kết quả nằm trong giới hạn độ chính xác an toàn.