← Quay lại
31/01/2026
•
24 phút
•
Chương 16: Thế còn trừ?
Sau khi bạn đã thuyết phục mình rằng rơle, ống hoặc transistor thực ra có thể được nối lại để cộng số nhị phân thì có lẽ bạn sẽ tự hỏi "Thế còn trừ?" Cứ an tâm là không phải bạn đang làm khó mình với những câu hỏi kiểu này đâu; thực tế là bạn khá sâu sắc đấy. Cộng và trừ bổ khuyết cho nhau theo một cách nào đó, nhưng cơ chế của cả 2 khá khác nhau. Một phép cộng luôn đi đều từ cột số ngoài cùng bên phải sang cột bên trái. Nhớ từ cột này được cộng vào cột tiếp theo. Nhưng ta không dùng nhớ trong phép trừ; mà ta mượn, và nó liên quan tới một cơ chế khác biệt về bản chất - một kiểu qua lại lộn xộn.
Ví dụ, hãy xem xét một bài toán trừ nặng nợ điển hình:
Ví dụ, hãy xem xét một bài toán trừ nặng nợ điển hình:
253 - 176 ----- ???
Nếu bạn như tôi, chỉ vừa nhìn vào cột ngoài cùng bên phải và thấy 6 lớn hơn 3, trong đầu bạn thốt lên "Đù". Bạn cần phải mượn từ cột kế tiếp bên trái và chính cột đó cũng đi mượn. Tôi sẽ không đi sâu vào những chi tiết hãi hùng nhưng nếu bạn tính đúng (hoặc sai giống tôi), bạn sẽ được đáp án là 77:
253 - 176 ----- 77
Giờ làm thế nào để ta bắt cổng logic tính được được kết quả này?
Chà, ta không cần cố làm gì. Thay vào đó, ta sắp dùng một kĩ thuật nhỏ mọn cho phép trừ mà không cần mượn. Trông thì tưởng là mẹo nhưng thật ra lại là bước đầu cốt yếu để hiểu cách số âm được lưu trong máy tính.
Bạn có lẽ đã được dạy rằng phép trừ là phép cộng một số âm. Theo một nghĩa nào đó, đây là thông tin vô ích vì nó không làm cho phép trừ dễ hơn. Nhưng nó có ý nghĩa khi ta có thể viết lại phép trừ như là cộng một số dương vào số âm:
-176 + 253 =
Giờ tôi muốn thêm vào vài số - một dương và một âm - để được phép cộng 4 số:
1000 - 176 + 253 - 1000 =
Ta cộng 1000 và trừ 1000, nên không làm thay đổi kết quả. Ta biết là 1000 bằng 999 cộng 1, nên thay vì bắt đầu với 1000 ta có thể viết 999 rồi cộng 1 vào sau. Chuỗi số dài hơn nhưng vẫn tương đương:
999 - 176 + 253 + 1 - 1000 =
Nhìn có vẻ lộn xộn, nhưng thôi hãy bắt đầu với nó từ trái sang phải nha. Bước đầu là trừ: 999 trừ 176. Vừa khít, bạn không cần mượn! Dễ dàng tính ra 999 trừ 176 bằng 823:
823 + 253 + 1 - 1000 =
Hiệu của 999 trừ đi một số được gọi là phần bù 9. Phần bù 9 của 176 là 823. Nó cũng đúng theo chiều ngược lại: phần bù 9 của 823 là 176. Điều hay ho là: bất kể là số nào, tính phần bù không bao giờ cần mượn.
Hai bước kế chỉ cần cộng. Trước tiên cộng 253 với 823 để được 1076:
1076 + 1 - 1000 =
Rồi cộng 1 và trừ 1000:
1077 - 1000 = 77
Giống với kết quả trước đó nhưng không cần mượn nợ mắc công.
Giờ đây là điều quan trọng: Khi dùng phần bù 9 để đơn giản hoá phép trừ bạn cần biết có bao nhiêu chữ số cần xử lý. Nếu một hoặc hai số có 4 chữ số, bạn sẽ cần tính phần bù 9 bằng 9999 rồi sau đó trừ 10000 ở cuối.
Nhưng nếu số trừ lớn hơn số bị trừ thì sao? Ví dụ, bài toán trừ
176 - 253 ----- ???
Thường bạn sẽ nhìn vào và nói "Hừm, mình thấy là số trừ lớn hơn số bị trừ nên phải đổi chỗ hai số, thực hiện tính trừ và nhớ là đáp án phải là số âm." Bạn có thể đổi chỗ trong đầu và viết kết quả như này:
176 - 253 ----- -77
Làm phép tính này mà không mượn thì hơi khác một chút với ví dụ trước đó, nhưng bắt đầu bằng việc đổi chỗ hai số, cộng 999 ở đầu và trừ 999 ở cuối:
999 - 253 + 176 - 999 =
Bạn bắt đầu như đã làm trước đó, lấy 999 - 253 để được phần bù 9:
746 + 176 - 999 =
Giờ cộng phần bù 9 vào 176:
922 - 999 =
Tại bước này trong bài toán trước, bạn có thể cộng 1 và trừ 1000 để được đáp án cuối cùng nhưng chiến lược đó không phù hợp ở đây. Thay vì vậy ta có một số dương 922 và số âm 999. Nếu đó là số âm 922 và 999 dương, bạn chỉ cần tính phần bù 9 của 922, là 77. Nhưng vì ta đổi dấu để thực hiện phần bù 9 này nên đáp án thực ra là -77. Không dễ hiểu như ví dụ đầu nhưng lại không cần mượn.
Kĩ thuật này cũng có thể dùng cho số nhị phân và thực tế là đơn giản hơn thập phân. Cùng xem nó hoạt động ra sao nhé.
Bài toán trừ ban đầu là
253 - 176 ----- ???
Khi đổi sang nhị phân thì trở thành
11111101 - 10110000 ---------- ????????
Trước tiên tôi sẽ đổi chỗ 2 số để bài toán trở thành cộng một số dương vào số âm. Số thập phân tương ứng được viết dưới số nhị phân:
-10110000 + 11111101 = -176 + 253 =
Giờ hãy cộng 11111111 (là 255 thập phân) ở đầu và sau đó cộng 00000001 (1 thập phân) rồi trừ 100000000 (256):
11111111 - 10110000 + 11111101 + 00000001 - 100000000 = 255 - 176 + 253 + 1 - 256 =
Trong nhị phân, phép trừ đầu tiên không cần nhớ vì số bị trừ là 11111111:
11111111 - 10110000 + 11111101 + 00000001 - 100000000 =
|_________________|
|
01001111 + 11111101 + 00000001 - 100000000 =Khi một số thập phân bị trừ ra khỏi chuỗi số 9, kết quả được gọi là phần bù 9. Với số nhị phân, trừ khỏi chuỗi số 1 được gọi là phần bù 1. Nhưng chú ý là ta không thật sự phải làm tính trừ để tính phần bù 1. Nhìn vào 2 số này. Phần bù 1 của 10110000 là 01001111 và phần bù 1 của 01001111 là 10110000:
1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 1
Những bit này bị đảo: Mỗi bit 0 trong một số trở thành một bit 1 trong phần bù 1 và mỗi bit 1 trở thành bit 0. Đó là lí do tại sao phần bù 1 thường được gọi là nghịch đảo. (Tới đây bạn có thể nhớ lại từ chương 8 là ta đã tạo ra một cổng logic được gọi là inverter (đảo) dùng để đổi 0 thành 1 và 1 thành 0.)
Bài toán giờ thành:
01001111 + 11111101 + 00000001 - 100000000 = 79 + 253 + 1 - 256 =
Giờ cộng 2 số đầu tiên lại:
01001111 - 11111101 + 00000001 - 100000000 =
|_________________|
|
101001100 + 00000001 - 100000000 =Được một số 9 bit, nhưng không sao. Giờ bài toán đã giảm thành:
101001100 + 00000001 - 100000000 = 332 + 1 - 256 =
Cộng 1 thì đơn giản:
101001101 - 100000000 = 333 - 256 =
Giờ việc còn lại là trừ số nhị phân tương đương của 256, chỉ cần bỏ đi bit ngoài cùng bên trái:
01001101 77
Và kết quả cuối cùng mà bạn rất vui khi biết rằng nó chính là đáp án ta đã tính ra trong thập phân.
Giờ hãy thử lại với 2 số đổi chổ. Trong thập phân, bài toán trừ là
176 - 253 ----- ???
Trong nhị phân nó trông thế này:
10110000 - 11111101 ---------- ?????????
Tương tự như cách làm với số thập phân, hãy đổi chỗ 2 số này. Ta sẽ cộng 11111111 ở đầu và trừ 11111111 ở cuối:
11111111 - 11111101 + 10110000 - 11111111 = 255 - 253 + 176 - 255 =
Bước đầu là tìm phần bù 1 của 11111101:
11111111 - 11111101 + 10110000 - 11111111 =
|_________________|
|
00000010 + 10110000 - 11111111 =Cộng với số tiếp theo:
10110010 - 11111111 = 178 - 255 =
Giờ trừ 11111111 thế nào đây? Khi trừ một số nhỏ hơn khỏi một số lớn hơn, bạn thêm 1 và trừ 100000000. Nhưng bạn không thể trừ theo cách này mà không mượn. Nên thay vì vậy, hãy lấy 11111111 trừ kết quả này:
11111111 - 10110010 = 01001101 255 - 178 = 77
Một lần nữa, chiến lược này thật sự nghĩa là ta đã đảo tất cả bit để được kết quả. Đáp án lại là số nhị phân tương đương với 77, nhưng với bài toán này, đáp án thực tế là -77.
Sự bất tiện ta gặp phải ghi trừ một số lớn khỏi số nhỏ hơn là lời nhắc rằng vẫn chưa xong. Ta vẫn chưa hoàn toàn giải quyết bài toán này triệt để.
Bất kể như vậy thì giờ ta đã có đủ kiến thức cần thiết để chỉnh sửa máy cộng được phát triển ở chương 14 sao cho nó có thể thực hiện được phép trừ cũng như phép cộng. Để vấn đề không trở nên quá phức tạp, máy cộng trừ mới này sẽ thực hiện phép trừ chỉ khi kết quả là một số dương.
Lõi của máy cộng là bộ cộng 8 bit ráp từ cổng logic:
Bạn nhớ lại là đầu vào A0 tới A7 và B0 tới B7 được nối với công tắc biểu thị 2 giá trị 8 bit được cộng. Đầu vào Carry In được nối đất, tương đương với bit 0. Đầu ra S0 tới S7 được nối với 8 bóng đèn hiển thị kết quả phép cộng. Vì phép cộng có thể được kết quả là giá trị 9 bit, đầu ra Carry Out cũng được nối với bóng đèn thứ 9. Bảng điều khiển trông như này:
Trong sơ đồ này, công tắc đang được cài đặt để cộng 183 (10110111) và 22 (00010110), cho ra kết quả là 205 (11001101) như trong dãy bóng đèn.
Bảng điều khiển mới để cộng trừ 2 số 8 bit chỉ cần sửa chút xíu thôi. Thay cho dấu cộng lớn, nó thêm một công tắc để biểu thị ta đang muốn cộng hay trừ.
Bạn tắt công tắc để cộng và bật lên để trừ như trên nhãn.
Một khác biệt khác nữa là chỉ 8 bóng đèn bên phải được dùng để hiển thị kết quả. Bóng đèn thứ 9 có nhãn là "Overflow" (tràn). Đây là thuật ngữ hay gặp khi lập trình máy tính trong vài ngữ cảnh khác nhau và hầu như nó luôn biểu thị một vấn đề. Ta cài đặt bảng điều khiển này để cộng 2 số 8 bit và trong nhiều trường hợp kết quả cũng sẽ là 8 bit. Nhưng nếu kết quả là 9 bit, thì đó là overflow. Kết quả tràn ra khỏi những gì ta đã đặt trước để hiển thị nó. Overflow cũng có thể xảy ra với phép trừ nếu ta phải trừ một số lớn ra khỏi một số nhỏ hơn. Overflow sáng lên có nghĩa là kết quả là số âm nhưng ta vẫn chưa điều chỉnh để hiển thị đầy đủ kết quả âm đó.
Phần bổ sung chính cho máy cộng là mạch tính phần bù 1 của một số 8 bit. Nhớ lại là phần bù 1 tương đương với bit nghịch đảo, nên mạch để tính phần bù 1 của số 8 bit trông có vẻ đơn giản như là 8 inverter:
Vấn đề với mạch này là nó luôn luôn đảo bit đi vào. Ta đang cố tạo ra máy làm cả tính cộng và trừ, nên mạch chỉ cần đảo bit chỉ khi thực hiện phép trừ thôi. Mạch phù hợp hơn như sau:
Một tín hiệu đơn, tên là Invert, là đầu vào cho một trong 8 cổng XOR (OR loại trừ). Nhớ lại cổng XOR thể hiện như sau:
XOR | 0 | 1 ----+---+--- 0 | 0 | 1 1 | 1 | 0
Nếu tín hiệu Invert là 0, 8 đầu ra của cổng XOR giống với 8 đầu vào. Ví dụ, nếu 01100001 là đầu vào thì 01100001 là đầu ra. Nếu tín hiệu Invert là 1, 8 tín hiệu đầu vào bị đảo. Nếu 01100001 là đầu vào thì 10011110 là đầu ra.
Hãy gói 8 cổng XOR này vào hộp tên là Ones' Complement (Phần bù 1):
Hộp Phần bù 1, hộp Bộ cộng 8 bit, và một cổng XOR cuối cùng giờ có thể nối lại như sau:
Chú ý dây tên Subtract ở góc trên bên phải. Nó đi từ công tắc Cộng/Trừ. Tín hiệu này là 0 nếu tính cộng và 1 để tính trừ. Với phép cộng, tín hiệu Invert vào mạch Phần bù 1 là 0 và mạch này không có hiệu ứng gì. Đầu vào CI cũng là 0. Giống với mạch cộng đơn giản.
Nhưng với phép trừ, đầu vào B (hàng công tắc thứ 2 trên bảng điều khiển) đều bị đảo bởi mạch Phần bù 1 trước khi vào bộ cộng. Cũng với phép trừ, bạn cộng 1 vào kết quả phép cộng bằng cách đặt đầu vào CI (Carry In) của bộ cộng là 1.
Tín hiệu Subtract và đầu ra CO (Carry Out) của bộ cộng cũng đi vào một cổng XOR được dùng để thắp sáng đèn Overflow. Nếu tín hiệu Subtract là 0 (nghĩa là đang làm tính cộng) bóng đèn sẽ sáng nếu đầu ra CO của bộ cộng là 1. Có nghĩa là kết quả của tính cộng lớn hơn 255.
Nếu đang tính trừ và số B nhỏ hơn số A, thì như bình thường đầu ra CO từ bộ cộng là 1. Nó biểu diễn 100000000 phải bị trừ ở bước cuối. Với phép trừ, đèn Overflow sáng chỉ khi đầu ra CO từ bộ cộng là 0. Có nghĩa là ta đang cố trừ một số lớn khỏi một số nhỏ hơn. Máy trình bày trước đó không được thiết kế để hiển thị số âm.
Tới giờ chắc là bạn phải mừng vì đã hỏi "Thế còn trừ?"
Tôi vẫn luôn nói về số âm trong chương này nhưng lại không cho biết số nhị phân âm trông ra sao. Bạn có thể đoán là dấu trừ truyền thống được dùng cho số nhị phân tương tự trong thập phân. Tỉ dụ như -77 được viết là -1001101 trong nhị phân. Bạn chắc chắn có thể dùng cách này nhưng một trong những mục tiêu khi dùng số nhị phân là biểu diễn mọi thứ chỉ bằng 0 và 1 - dù cho kí hiệu đó có bé nhỏ như dấu trừ.
Tất nhiên bạn có thể dùng thêm một bit cho nó. Bạn có thể cho bit bổ sung này là 1 cho số âm và 0 cho số dương và giữ nguyên những bit khác. Cách này ổn nhưng không đưa bạn đi xa được. Thực ra còn một cách khác nữa và đã trở thành tiêu chuẩn để biểu diễn số âm trong máy tính. Lý do chính khiến nó trở thành chuẩn là vì đã cung cấp một phương pháp tránh rắc rối để cộng số âm và dương lại với nhau. Hạn chế lớn nhất là bạn phải xác định trước cần bao nhiêu chữ số cho tất cả số mà bạn sẽ gặp.
Nghĩ kĩ thêm một chút: Mặt lợi của việc viết số âm và dương mà ta thường dùng là ta có thể viết mãi như thế được. Ta tưởng tượng số 0 nằm ở giữa một dòng vô cực các số dương chạy mãi về một hướng và một dòng vô cực các số âm ở đầu kia cũng chạy mãi:
... -1.000.000 -999.999 ... -3 -2 -1 0 1 2 3 ... 999.999 ... 1.000.000 ...
Nhưng giả như ta không cần vô tận số. Giả dụ ta biết ngay từ đầu mọi số mà ta gặp phải sẽ nằm trong một khoảng cụ thể.
Hãy cùng xem xét một tài khoản ngân hàng mà đôi khi người ta thấy số âm. Giả sử bạn không bao giờ có nỗi 500 đô trong tài khoản và ngân hàng đã cấp cho bạn hạn mức là 500 đô. Có nghĩa là tài khoản của bạn luôn là một con số nằm đâu đó giữa 499 và -500 đô. Cũng giả sử là bạn không bao giờ nạp tiền nhiều tới 500 đô, cũng không bao giờ chi hơn 500 đô, và bạn chỉ xài tiền theo đô chứ không dùng xu.
Tập điều kiện này có nghĩa là khoảng số mà bạn giao dịch với tài khoản là từ -500 tới 499. Tổng cộng có 1000 số. Giới hạn này ngầm hiểu là bạn có thể dùng chỉ 3 chữ số thập phân và không cần dấu trừ để biểu diễn tất cả số mà bạn cần. Bí quyết ở đây là nhận ra không cần số dương từ 500 tới 999. Đó là vì bạn đã xác định số dương tối đa cần là 499. Nên những số 3 chữ số từ 500 tới 999 có thể dùng để đại diện số âm. Đây là cách làm:
Để ám chỉ -500, dùng 500.
Để ám chỉ -499, dùng 501.
Để ám chỉ -498, dùng 502.
(cứ thế)
Để ám chỉ -2, dùng 998.
Để ám chỉ -1, dùng 999.
Để ám chỉ 0 dùng 000.
Để ám chỉ 1 dùng 001.
Để ám chỉ 2 dùng 002.
(cứ thế)
Để ám chỉ 497 dùng 497.
Để ám chỉ 498 dùng 498.
Để ám chỉ 499 dùng 499.
Nói cách khác, số 3 chữ số nào bắt đầu với 5, 6, 7, 8, 9 là số âm. Thay vì số âm và dương chạy mãi về 2 phía từ số 0 như này:
-500 -499 -498 ... -4 -3 -2 -1 0 1 2 3 4 ... 497 498 499
Có thể viết lại như sau:
500 501 502 ... 996 997 998 999 000 001 002 003 004 ... 497 498 499
Chú ý là nó tạo một dạng vòng. Số âm thấp nhất (500) trông như thể nó tiếp nối từ số dương lớn nhất (499). Và số 999 (thực tế là -1) thì thiếu một để bằng không. Cộng 1 vào 999 thường thì bạn nhận được 1000. Nhưng vì ta chỉ dùng 3 chữ số nên thực ra lại là 000.
Loại biểu thị này được gọi là phần bù 10. Để chuyển một số âm 3 chữ số sang phần bù 10, lấy 999 trừ đi nó rồi cộng 1. Nói cách khác, phần bù 10 là phần bù 9 cộng 1. Ví dụ để tính phần bù 10 của -255 ta lấy 999 - 255 được 744 rồi cộng 1 thành 745.
Khi dùng phần bù 10, bạn không phải trừ số nào cả. Mọi thứ đều là cộng.
Giả dụ tài khoản của bạn có 143 đô. Bạn xài 78 đô. Thường bạn tính ra số tiền trong tài khoản còn lại như này:
143 - 78 ----- 65
Nó là một phép trừ mượn 2 lần. Nhưng với phần bù 10, -78 được viết là 999 - 78 + 1 = 922, nên nó chỉ là:
143 + 922 ----- 1065
Bỏ qua phần tràn và kết quả chính là 65 đô. Nếu sau đó bạn xài tiếp 150 đô, bạn phải cộng -150, trong phần bù 10 là 850:
65 + 850 ----- 915
Kết quả bắt đầu với số 9 nên nó là một số âm bằng -85 đô.
Hệ thống tương đương trong nhị phân là phần bù 2 và nó là tiêu chuẩn để biểu diễn số âm và dương trong máy tính.
Giả sử rằng ta làm việc với byte nên mọi thứ được biểu diễn bởi số 8 bit. Chúng nằm trong khoảng từ 00000000 tới 11111111. Tới giờ ta nghĩ những số này tương đương từ 0 tới 255 trong hệ thập phân. Nhưng nếu bạn cũng muốn biểu diễn số âm, mọi số 8 bit bắt đầu bằng 1 sẽ đại diện cho một số âm như trong bảng sau:
Số nhị phân | Số thập phân -------------------------- 10000000 | -128 10000001 | -127 10000010 | -126 10000011 | -125 (...) (...) 11111101 | -3 11111110 | -2 11111111 | -1 00000000 | 0 00000001 | 1 00000010 | 2 (...) (...) 01111100 | 124 01111101 | 125 01111110 | 126 01111111 | 127
Khoảng số mà bạn có thể biểu diễn giờ bị giới hạn từ -128 tới +127. Bit quan trọng nhất (ngoài cùng bên trái) được biết tới là bit dấu. Bit dấu là 1 cho số âm và 0 cho số dương.
Để tính phần bù 2 trước tiên bạn phải tính phần bù 1 rồi cộng 1 vào. Điều này giống với việc đảo tất cả chữ số rồi cộng 1. Ví dụ, số thập phân 125 là 01111101. Để biểu diễn -125 trong phần bù 2, đầu tiên đảo hết các chữ số của 01111101 thành 10000010 rồi cộng 1 để được 10000011. Bạn có thể kiểm chứng kết quả bằng bảng trên. Để làm ngược lại cũng giống vậy - đảo tất cả bit rồi cộng 1.
Ưu điểm lớn nhất của hệ thống này là số âm và số dương có thể được biểu diễn mà không cần dấu trừ. Ưu điểm lớn hơn có lẽ là nó cho phép ta thoải mái cộng số âm và dương chỉ bằng quy tắc cộng. Ví dụ thử cộng 2 số nhị phân tương đương với -127 và 124. Dùng bảng trên để tra cứu, nó chỉ đơn giản là
10000001 + 01111100 ---------- 11111101
Kết quả tương đương với 3 trong thập phân.
Thứ bạn cần để ý ở đây là tràn. Đó là khi kết quả của một phép cộng lớn hơn 127. Giả như bạn cộng 125 với chính nó:
01111101 + 01111101 ---------- 11111010
Bởi vì bit cao của tổng được đặt là 1, kết quả phải được dịch là một số âm, cụ thể tương đương với số nhị phân này là -6. Rõ ràng cộng 2 số dương không thể được số âm, nhưng đây lại chính xác là điều đã xảy ra. Nó sai một cách rõ ràng và kỳ lạ.
Có điều tương tự xảy ra khi -125 được cộng với chính nó:
10000011 + 10000011 ---------- 100000110
Nó cũng thể hiện một vấn đề: Ta đã quyết định từ trước là sẽ giới hạn bản thân với số 8 bit, nên chữ số ngoài cùng bên trái của kết quả phải bị bỏ qua. 8 bit bên phải tương đương với 6, là một số dương.
Nói chung, kết quả của một phép cộng liên quan số phần bù 2 âm và dương không hợp lệ nếu bit dấu của 2 toán hạng giống nhau nhưng bit dấu của kết quả lại khác. Kết quả luôn hợp lệ khi cộng một số dương và một số âm vì kết quả luôn nằm trong khoảng -128 tới 127.
Dưới đây là máy cộng đã chỉnh sửa để cộng 2 số phần bù 2 8 bit:
Bộ cộng 8 bit giờ đã quen thuộc. Vài cổng đã được thêm vào để xác định tràn. Nhớ rằng những bit quan trọng nhất biểu diễn dấu của số: 1 nếu âm và 0 nếu dương. Ở phía đầu vào, những bit dấu này là A7 và B7. Bit dấu của tổng là S7. Để ý là bit dấu của tổng bị đảo trước khi nó được dùng trong cổng AND và cổng NOR.
Cổng AND phát hiện điều kiện tràn cho số âm. Nếu bit dấu của đầu vào A và B đều là 1 (cho 2 số âm) và bit dấu của tổng là 0 (cho kết quả dương), rõ ràng có gì đó không đúng ở đây. Tổng của 2 số âm cũng là số âm nên nó không thể vừa với 8 bit ta đã định sẵn.
Cổng NOR phát hiện tràn cho số dương. Nếu bit dấu A và B đều là 0 và bit dấu của tổng là 1, có nghĩa là 2 số dương cộng lại thành một số lớn khiến cho nó phải được biểu diễn như một số âm! 3 đầu vào cho cổng NOR sẽ đều là 0 và đầu ra của cổng NOR sẽ là 1, biểu thị tràn.
Với số lượng bit dùng trong chương này, số nhị phân khá đơn giản. Chúng đáp ứng với số thập phân theo một cách rất trực tiếp. Một số nhị phân 8 bit có thể nằm trong khoảng từ 0 tới 255. Những số nhị phân như vậy được gọi là unsigned (không dấu) vì chúng luôn là số dương.
Phần bù 2 cho phép ta làm việc với số nhị phân signed (có dấu). Những số này có thể âm hoặc dương. Với giá trị 8 bit, chúng có thể nằm trong khoảng từ -128 tới 127. Nó có cùng số lượng số (256) nhưng khác khoảng.
Thuật ngữ toán học chính thức cho những số ta làm việc sớm giờ là integer (số nguyên) - một số có thể là âm hoặc dương, nhưng không có phần phân số. Trong đời sống, integer 8 bit thường không đủ dùng cho nhiều việc và lập trình viên dùng integer 16-bit thay thế (cần 2 byte cho một số) hoặc integer 32 bit (4 byte) hay thậm chí integer 64 bit (8 byte).
Trong mỗi trường hợp, những số này có thể có dấu hoặc không. Bảng sau tóm gọn khoảng giá trị thập phân có thể có với những kích cỡ integer này:
Cỡ Integer | Khoảng không dấu | Khoảng có dấu
-----------+----------------------+-------------------------
8 bit | 0 tới 255 | -128 tới 127
16 bit | 0 tới 65.535 | -32.768 tới 32.767
32 bit | 0 tới | -2.147.483.648 tới
| 4.294.967.295 | 2.147.483.647
64 bit | 0 tới | -9223372036854775808 tới
| 18446744073709551615 | 9223372036854775807Các khoảng dựa trên luỹ thừa 2. Ví dụ, 16 bit cho phép biểu diễn 2 mũ 16, 65.536 số khác nhau. Những số này nằm trong khoảng từ 0 tới 65.535 hoặc từ -32.768 tới 32.767.
Tự bản thân những con số này không nói cho bạn biết chúng có dấu hay không. Giả dụ như ai đó hỏi "Tôi có một số nhị phân 8 bit với giá trị là 10110110. Số thập phân tương đương là gì?" Bạn phải hỏi ngay "Nó là số có dấu hay không có dấu? Có thể là -74 hoặc 182".
Bit chỉ là những số 0 và 1. Chúng không nói cho bạn biết điều gì về bản thân chúng cả. Thông tin đó phải đến từ ngữ cảnh mà chúng được dùng.