CHƯƠNG 3: CÁC PHÉP TOÁN SỐ HỌC
3.2. Phép cộng và trừ với số dấu phẩy tĩnh
Phép cộng số nhị phân và ý nghĩa của hiện tượng tràn overflow đã được chúng ta điểm qua ở trong chương 2. Trong chương này, chúng ta sẽ xem xét kỹ phép cộng và trừ đối với số không dấu và có dấu một cách kỹ càng. Từ khi số bù 2 được sử dụng để biểu diễn một con số đến nay, nó đã được sử dụng rất phổ biến, do vậy, chúng ta sẽ tập trung tìm hiểu các phép toán trên số bù 2
3.2.1. Phép toán cộng và trừ với số bù 2
Trong phần này, chúng ta sẽ tìm hiểu phép cộng đối với số bù 2 có dấu. Tại sao lại chỉ là phép cộng mà không phải là phép trừ ? Phép trừ bản chất cũng là phép cộng, chúng ta có thể coi phép trừ hai số a và b là một phép cộng như sau
Với cách biểu diễn như trên, chúng ta có được số âm từ một số bất kỳ bằng cách lấy số bù 2 của chúng (tìm số bù 1 rồi cộng thêm 1 đơn vị), và để thực hiện phép trừ thì ta sẽ thực hiện 1 phép cộng.
Xem xét phép cộng trong các trường hợp các số là 2 số dương, 1 số âm và 1 số dương và 2 số âm. Giả sử các số được biểu diễn là số 8 bit
Với 3 ví dụ về phép cộng ở trên, ta thấy nguyên tắc chung của phép cộng là rất quen thuộc vì đã được trình bày trong chương 2. Ở đây chỉ có một vấn đề duy nhất cần bàn luận đó là bit cờ được loại bỏ trong phép cộng giữa 1 số âm với 1 số dương và giữa 2 số âm. Mặc dù bit cờ đã được set up lên 1, nhưng điều này không có nghĩa là phép toán của chúng ta đã thực hiện sai. 2 ví dụ ở trên đã chứng minh rất rừ rằng mặc dự bit cờ là 1 nhưng kết quả lại hoàn toàn đỳng.
Trong trường hợp nào kết quả là chấp nhận được khi bit cờ bằng 1
Khi tiến hành phép cộng 2 số dương có giá trị lớn và cùng dấu, hiện tượng tràn dấu sẽ xảy ra khi số lượng các bit dữ liệu biểu diễn con số không đủ lớn. Ví dụ khi ta cộng 2 số +80 và +50 được biểu diễn bởi số 8 bit có dấu. Về mặt toán học ta sẽ có kết quả là +130 nhưng máy tính sẽ cho ta kết quả là -126
Điều này hoàn toàn không ngạc nhiên vì số 8 bit có dấu chỉ có giá trị lớn nhất là +127. Mặc dù chuỗi số 10000010 có giá trị đúng là 130 nhưng kết quả không được chấp nhận bởi lập trình viên.
Để phân biệt khi nào thì kết quả có thể được chấp nhận, chúng ta có 2 định nghĩa sau đây
- Khi cộng 2 số cùng dấu, nếu kết quả có dấu ngược lại đồng thời có hiện tượng tràn dấu thì kết quả đó là sai. Nếu cộng 2 số khác dấu, hiện tượng kết quả sai do tràn dấu sẽ không bao giờ diễn ra
- Nếu một số âm trừ đi một số dương và kết quả là dương hoặc một số dương trừ đi một số âm và kết quả là âm thì hiện tượng tràn dấu đã xảy ra và kết quả là không chính xác
3.2.2. Mạch phần cứng của phép cộng và trừ
Nguyên lý của phép cộng
Bảng chân lý và mạch mô tả dùng PLA
Mạch cộng 4 bit có nhớ
Tổng hợp mạch cộng 16 bit từ mạch cộng 4 bit
Tương tự ta có thể thiết kế được mạch trừ với bảng chân lý và mô hình như sau
Bộ trừ 4 bit có nhớ
Với phân tích về mạch trừ với bản chất là phép cộng với số trừ được chuyển sang số âm, ta có thể thiết kế được mạch vừa thực hiện cả phép cộng và trừ như dưới đây
Trong mạch trên, khi thực hiện phép cộng, tín hiệu chân / có tín hiệu là 0. Khi đó 4 phần tử XOR không có tác dụng trong mạch. Các chân bi lần sẽ đưa trực tiếp vào các bộ cộng có nhớ. Phần tử nhớ C0 là 0. Khi thực hiện phép tính trừ, tín hiệu chân / có tín hiệu bằng 1. 4 phần tử XOR có chức năng đảo các bit của các tín hiệu bi hình thành nên số bù 1. Tín hiệu C0 là 1 được đưa vào bộ nhớ có tác dụng để chuyển số bù 1 sang số bù 2 tức là số âm của B. Như vậy, mạch sẽ thực hiện phép toán A + (-B)
3.2.3. Phép cộng và trừ đối với số bù 1
Mặc dù không còn được sử dụng một cách rộng rãi nhưng phép toán với số bù 1 đã từng được sử dụng trong những ngày đầu tiên của máy tính điện tử. Phép toán đối với số bù 1 khác một chút đối với số bù 2 là bit tràn không bị loại bỏ mà nó được sử dụng trong phép toán. Cách sử dụng bit nhớ này được gọi là
“làm tròn bit nhớ”. Phương pháp làm tròn bit nhớ được trình bày với 2 ví dụ dưới đây, áp dụng cho 2 phép toán là số nguyên và số không nguyên
Tại sao lại cần phải có bước “làm tròn bit nhớ”. Để trả lời câu hỏi này chúng ta lật lại 2 vấn đề mà chúng ta đã biết trong các chương trước.
- Số bù 1 có 2 giá trị chuỗi số biểu diễn số +0 và -0. Về mặt giá trị chúng hoàn toàn bằng nhau nhưng về cách biểu diễn thì chúng cách nhau 1 đơn vị. Do đó ta cân phải bù giá trị này trong phép toán
- Với phép cộng 2 số cùng dấu dương và kết quả chưa vượt qua khả năng biểu diễn của chuỗi số nhị phân, hiện tượng tràn sẽ không xảy ra, kết quả vẫn đúng. Nếu hiện tượng tràn xảy ra, kết quả sai. Khi cộng 2 số âm, hoặc giữa 1 số âm và 1 số dương, hiện tượng tràn xảy ra, việc làm tròn bít nhớ khắc phục hiện tượng 2 số +0 và -0
3.3. Phép nhân và chia với số dấu phẩy tĩnh
Phép nhân và chia với số dấu phẩy tĩnh có thể được phân tích thành tổ hợp các phép toán cộng, trừ và dịch. Trong phần này, chúng ta sẽ phân tích kỹ phương pháp thực hiện phép toán nhân và chia đối với số dấu phẩy tĩnh, đầu tiên là với số không dấu rồi sau đó là số có dấu
3.3.1. Phép nhân số không dấu
Quá trình thực hiện nhân số không dấu được thực hiện tương tự như đối với số thập phân
Phép nhân được thực hiện bằng cách lần lượt dịch sang trái số nhân M, các kết quả của phép dịch này được thực hiện cộng với nhau hay không tùy thuộc vào giá trị của bit tương ứng trong số đem nhân Q. Kết quả cuối cùng P là kết quả của phép nhân. Hai số n bit nhân với nhau sẽ cho ta kết quả là một số 2n bit.
Khi thực hiện phép nhân đối với 2 số n bit có dấu, kết quả có độ lớn là số 2n-1 bit trong đó có 1 bit dấu
Sơ đồ nguyên lý mạch phần cứng
Mạch phần cứng thực hiện phép tính cộng tương tự như nguyên tắc thực hiện phép toán cộng. Phần cứng của mạch bao gồm 1 bộ cộng 4 bit và 3 thanh ghi có độ dài 4 bit và 1 thanh ghi tràn 1 bit. Để thực hiên phép nhân, số nhân M được đưa vào thành ghi M, số đem nhân được đưa vào thanh ghi Q, nội dung các thanh ghi A và C còn lại được đặt ở giá trị 0. Trong quá trình thực hiện phép cộng, giá trị của bit tận cùng bên phải của thanh ghi Q sẽ quyết định có thực hiện phép cộng giá trị M vào bộ cộng hay không. Sau khi thực hiện phép cộng đó, cờ nhớ C, số đem nhân Q và thanh ghi A được dịch sang phải 1 bit. Điều này có hiệu ứng tương ứng như đẩy số nhân M dịch sang phải tương ứng với quá trình nhân 2 số bằng tay, đồng thời đưa các bit tiếp theo trong thanh ghi Q vào bộ điều khiển dịch và cộng để thực hiện phép toán
3.3.2. Phép chia số không dấu
Trong quá trình thực hiện phép chia số nhị phân, ta phải cố gắng trừ số chia M từ số bị chia Q bằng cách sử dụng ít nhất số bit trong số bị chia. Nguyên lý của phép chia ngược lại hoàn toàn với phép nhân. Trong phép chia, thay vì dịch sang phải trong phép nhân, ta sẽ thực hiện dịch sang trái; thay vì thực hiện phép cộng, ta sẽ thực hiện phép trừ. Nếu kết quả của phép trừ là âm (do tràn số), ta sẽ thực hiện khôi phục lại giá trị trước khi trừ, dịch tiếp rồi tiếp tục phép trừ đề thực hiện tiếp phép chia.
Sơ đồ mạch phần cứng
Cấu tạo của bộ chia bao gồm 1 bộ cộng 5 bit, bộ điều khiển, thanh ghi 4 bit lưu trữ số bị chia Q, 2 thanh ghi 5 bit lưu trữ số chia M và phần dư kết quả phép chia A. Trong mạch này, A và M là các thanh ghi 5 bit vì ta cần sử dụng bit có trọng số lớn nhất để xác định dấu của kết quả phép trừ, tức là kiểm tra xem phép trừ có được thực hiện hay không
Để thực hiện chia 2 số, số bị chia được đặt trong thanh ghi Q, số chia đặt trong thanh ghi M, thanh ghi A và các bit cao nhất của M được xóa về 0. A và Q được dịch sang trái 1 bit rồi lấy giá trị đó trừ đi M. Kết quả có bit tận cùng bên trái có giá trị là 1, A sẽ được khôi phục và bit tận cùng bên phải của Q bị xóa về 0 (tức là kết quả phép chia của bit này là 0 vì phép trừ không hoàn thành). Nếu bit tận cùng bên trái của A có giá trị 0, phép trừ đã thực hiện thành công, tức là phép chia sẽ có kết quả là 1, khi đó q0 được set lên 1. Ta có thể xem xét các bước đã diễn ra ở ví dụ thực hiện phép chia với số chia là 3, số bị chia là 7 ở lưu đồ trên
3.3.3. Phép nhân và chia số có dấu
Trong trường hợp số thực hiện phép nhân đều là số dương, việc thực hiện phép toán sẽ không có gì khác như trong trường hợp số không dấu.
Trường hợp nhân một số âm với một số dương, ta hãy xét ví dụ nhân số +1 với số -1-
Kết quả đúng phải là -1 nhưng ở đây, kết quả có giá trị là +15. Nguyên nhân của hiện tượng này là bit dấu không được mở rộng về phía trái đủ để biểu diễn bit dấu. Để khắc phục hiện tượng này, một phần của các phần tử thực hiện phép nhân sẽ được mở rộng độ lớn bằng với kết quả. Ta thấy ngay giá trị của phép nhân đã đúng trong hình biểu diễn bên phải.
Phép chia được thực hiện phức tạp hơn rất nhiều. Chúng ta sẽ không tìm hiểu thêm về nó nữa. Tuy nhiên, về mặt nguyên tắc chung, chúng ta thực hiện phép chia số có dấu bằng cách chuyển nó sang số dương, thực hiện phép chia rồi chuyển trở lại số có dấu.