Bài giảng trong khoá luyện thi FE - Chuẩn kỹ sư CNTT Nhật Bản
Bài này chỉ bàn đến việc mã hóa các giá trị số nguyên. Việc mã hóa các giá trị số không nguyên (số thực) được xem xét trong bài khác.

Cần nhớ

  • Signed bit : bit dấu cho biết số nhận giá trị âm hay dương
  • Most Significant Bit (MSB): bit có trọng số cao nhất hoặc dùng để làm bit dấu
  • Complement: Hai số nguyên cùng giá trị tuyệt đối nhưng khác dấu thì gọi là bù nhau.
  • One complement: Số âm bù 1
  • Two complement: Số âm bù 2

Thể hiện số nguyên dương và âm

Một kiểu biến nguyên dương có N bit thể hiện ví dụ kiểu byte (N = 8 bit) sẽ thể hiện được từ 0 đến 2N−12^N - 12N1. Vẫn với N bit cần thể hiện cả số nguyên dương và âm, chúng ta cần dùng riêng một bit dấu (signed bit), như vậy chỉ còn N-1 bit thể hiện giá trị tuyệt đối của số.

0 ở MSB thể hiện số dương
1 ở MSB thể hiện số âm

Trục số mô tả dải số âm bên trái gốc 0 và dải số dương bên phải gốc 0
Âm dương dạng trục số

Một signed integer có 4 bit, Most Significant Bit là bit dấu
Signed vs Unsigned

Biểu diễn dạng trục số của signed integer 8 bit.
signed vs unsigned

One complement - Bù 1

Phần bù của một số nhị phân là giá trị thu được bằng cách đảo ngược tất cả các bit trong biểu diễn nhị phân của số dương.
One compliment

Trong hình dưới là số nguyên 4 bit. Số 0 có thể biểu diễn gồm 4 bit 0 hoặc 4 bit 1.
One Compliment2

Trong mạch điện tử, để tìm số âm bù một, chúng ta dùng các cổng logic NOT.
Not Gate

Cộng 2 số âm và dương bù nhau

Nếu làm phép cộng binary 2 số nguyên âm dương cùng giá trị tuyệt đối, khác dấu (bù nhau)
3+(−3)=00112+11002=111123 + (-3) = 0011_2 + 1100_2 = 1111_23+(3)=00112+11002=11112

Trong One complement với số nguyên 4 bit thì 00002=11112=0100000_2 = 1111_2 = 0_{10}00002=11112=010

Thử cộng 4−34 - 343 dạng số nguyên nhị phân 4 bit
4−3=01002+11002=1000024 - 3 = 0100_2 + 1100_2 = 10000_243=01002+11002=100002
Rõ ràng là bị tràn số (overflow) thêm số 1 ở vị trí thứ 5, 4 chữ số còn lại là 0. Thay vì để tràn số, hay chuyển bit tràn cộng với kết quả hiện có.

4−3=01002+11002=100002(overflow)→000124 - 3 = 0100_2 + 1100_2 = 10000_2 (overflow) \to 0001_243=01002+11002=100002(overflow)00012

Vấn đề của One complement là giá trị 0 có 2 cách biểu diễn

Trong One complement với số nguyên 4 bit thì giá trị 0 có 2 cách biểu diễn 00002=11112=0100000_2 = 1111_2 = 0_{10}00002=11112=010. Điều này khá là kỳ cục, dễ gây nhầm lẫn.

Two complement - Bù 2

Two complement cải tiến từ One Complement bằng cách cộng thêm 1 sau khi thực hiện One Complement.

Ví dụ: 3=001123 = 0011_23=00112
Chuyển sang One complement −3=11002-3 = 1100_23=11002
Cộng thêm 1 để thành Two Complement −3=11012-3 = 1101_23=11012
Two Complement

Hãy thử làm lại phép cộng
4−3=01002+11012=00012=1104 - 3 = 0100_2 + 1101_2 = 0001_2 = 1_{10}43=01002+11012=00012=110
Lúc này hiện tượng tràn số không diễn ra, kết quả thu được đúng như mong muốn.

Two complement có 2 ưu điểm so với One complement

  1. Giá trị 0 chỉ có 1 biểu diễn duy nhất
  2. Cộng số dương và âm hay lấy số dương trừ số dương không bị tình trạng tràn số 1 (overflow)