sohoctrongmaytinh50%

28
Shc trong máy tính Translater: huahongquan2007 1 3

Upload: huahongquan2007

Post on 05-Jul-2015

402 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

1

3

Page 2: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

2

3.1 Lời mở đầu 3.2 Số có dấu và không dấu 3.3 Phép tính cộng và phép tính trừ 3.4 Phép tính nhân 3.5 Phép tính chia 3.6 Dấu chấm động 3.7 Vấn đề thực tế: Dấu chấm động trong IA-32 3.8 Các sai lầm và cạm bẫy 3.9 Kết luận 3.10 Quan điểm lịch sử và những điều mở rộng 3.11 Bài tập

Năm thành phần cấu tạo cơ bản của một máy tính

Page 3: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

3

Ngôn ngữ của máy tính gồm dãy các bit do đó các từ được biểu diễn dưới dạng mã nhị phân. Mặc dù các số tự nhiên 0,1, 2 …. có thể biểu diễn ở dạng thập phân lẫn nhị phân , thế nhưgn còn các loại số khác thì sao? Ví dụ:

Số âm được biểu diễn thế nào? Con số lớn nhất có thể biểu diễn trong thế giới máy tính? Điều gì sẽ xảy ra nếu một phép tính đưa ra một số lớn hơn số có thể biểu diễn? Phân số và số thực thì sao?

Điều thực sự là một bí ấn: Làm thế nào mà máy có thể thật sự nhân hay chia số? Mục đích của chương này là để làm sáng tỏ bí ẩn này, bao gồm: biểu diễn số, thuật toán tính toán, các bộ máy mà thực hiện theo những thuật toán này và mối tương quan giữa tất cả các chỉ thị (instructions). Sự thấu hiểu điều này sẽ giúp bạn giải thích được các thắc mắc khi gặp với máy tính (Nếu bạn đã quen thuộc với kiểu số nhị phân có dấu, bạn có thể bỏ qua mục tiếp theo và đi tới mục 3.3 tại trang 12).

Số có thể được biểu diễn trong bất cứ hệ nào; con người ưa thích hệ thập phân, trong khi đó, hệ nhị phân là tốt nhất cho máy tính. Để tránh sự nhầm lẫn, chúng tôi ghi chỉ số ten với số hệ thập phân và two với số hệ nhị phân.

Trong bất cứ hệ nào, giá trị của giá trị của số d thứ i là:

d x basei

Trong đó, i bắt đầu từ số 0 và tăng dần từ phải qua trái.

Ví dụ:

1011two = 1x 23 + 0 x 22 + 1x21 + 1x20 = 11ten

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1

3.1 Lời mở đầu

3.2 Kiểu số có dấu và không dấu

(32 bits wide)

Page 4: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

4

Hardware Software Interface

Trong MIPS, 1 word có độ dài 32 bits, nên chúng ta có thể biểu diễn 232 số loại 32-bit khác nhau.

Khoảng dữ liệu này trong khoảng từ 0 tới 232– 1(4,294,967,295ten):

0000 0000 0000 0000 0000 0000 0000 0000two = 0ten

0000 0000 0000 0000 0000 0000 0000 0001two = 1ten

0000 0000 0000 0000 0000 0000 0000 0010two = 2ten

... ...

1111 1111 1111 1111 1111 1111 1111 1101two = 4,294,967,293ten

1111 1111 1111 1111 1111 1111 1111 1110two = 4,294,967,294ten

1111 1111 1111 1111 1111 1111 1111 1111two = 4,294,967,295ten

Mã nhị phân thì không tự nhiên với con người ; chúng ta có 10 ngón tay nên hệ 10 là tự nhiên.

Tại sao máy tính lại không dùng hệ thập phân? Trong thực tế, máy tính đầu tiên đã hỗ trợ các phép tính thập phân. Vấn đề là máy tính vẫn dùng tín hiệu bật / tắt, nên số hệ thập phân đơn giản là biểu diễn bằng nhiều số nhị phân. Hệ thập phân đã thể hiện sự không hiểu quả của nó nên các máy đời sau dùng tất cả là nhị phân, và chỉ chuyển thành thập phân trong quá trình nhập xuất.

Ta phải nhớ rằng kiểu bit ở trên đơn giản là đại diện cho các số. Số thực sự có một số lượng vô hạn các con số,

với gần như tất cả là số 0 ngoại trừ vài con số ở bên phải cùng. Chỉ là chúng ta thường không làm các số 0 dẫn đầu xuất hiện.

Phần cứng có thể được thiết kế để cộng , trừ , nhân , chia những con số nhị phân này. Nếu kết quả của những phép tính này không thể được thể hiện bằng những bit ở bên phải cùng, thì trường hợp tràn (overflow) sẽ xảy ra. Nó thì phụ thuộc vào hệ điều hành và chương trình để quyết định rằng sẽ làm gì khi xảy ra overflow.

Chương trình máy tính tính toán cả số dương và số am, nên chúng ta cần một cách biểu diễn để phân biệt số

Bài tập

Đáp án

Chúng ta có thể biểu diễn các số như những chuỗi kí tự ASCII thay cho một biến nguyên. Bộ nhớ sẽ tăng lên bao nhiêu nếu số một tỉ được biểu diễn bằng ASCII thay vì biến int 32 bit?

Một tỉ là 1 000 000 000, nên nó sẽ cần 10 số ASCII, mỗi số 8 bits. Nên bộ nhớ sẽ tốn gấp (10x8)/32 = 2.5 lần.

Thêm vào đó, phần cứng để cộng trừ nhân chia những số như vậy sẽ khó khăn hơn. Những khó khăn đó giải thích tại sao những chuyên gia về máy tính tin tưởng rằng số nhị phân là tự nhiên

Page 5: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

5

dương và số âm. Giải pháp rõ ràng nhất là thêm một dấu âm ( - ), điều mà có thể biểu diễn một cách thuận tiện bằng một

bit đơn lẻ; tên của cách biểu diễn này là sign and magnitude (dấu và độ lớn).

Cách biểu diễn “dấu và độ lớn” có rất nhiều thiếu sót. Đầu tiên, nó không rõ ràng rằng sẽ đặt bit dấu chỗ nào.

Bên trái hay bên phải? Những máy tính thời kì đầu đã thử cả hai. Thứ hai, việc thêm cho dấu và độ lớn có thể cần một

bước phụ để đặt dấu, bởi vì chúng ta không thể biết trước rằng dấu phù hợp sẽ là gì? Cuối cùng, để bit dấu riêng nghĩa là

cách “dấu và độ lớn” sẽ có cả số 0 dương và âm, điều này sẽ dẫn tới rắc rối cho người lập trình lơ đễnh. Và do đó, cách

“dấu và độ lớn” này đã sớm bị loại bỏ.

Trong quá trình tìm kiếm một cách thay thế tốt hơn, một câu hỏi đã xuất hiện rằng: liệu điều gì sẽ xảy ra nếu ta

lấy một số không dấu trừ cho một số không dấu lớn hơn. Câu trả lời là máy tính sẽ cố mượn những bit 0 ở đầu , và kết quả

là một chuỗi của những bit 1 ở đầu.

Thấy rằng không hề có một cách thay thể nào tốt hơn, cách giải quyết cuối cùng là lựa ra một cách biểu diễn mà

sẽ làm máy tính đơn giản hơn: dẫn đầu bởi dãy số 0 sẽ là dương, dẫn đầu bởi dãy số 1 là âm. Quy tắc biểu diễn những số

nhị phân có dấu này được gọi là bù 2 (two’s complement):

0000 0000 0000 0000 0000 0000 0000 0000two = 0ten

0000 0000 0000 0000 0000 0000 0000 0001two = 1ten

0000 0000 0000 0000 0000 0000 0000 0010two = 2ten

... ...

0111 1111 1111 1111 1111 1111 1111 1101two = 2,147,483,645ten

0111 1111 1111 1111 1111 1111 1111 1110two = 2,147,483,646ten

0111 1111 1111 1111 1111 1111 1111 1111two = 2,147,483,647ten

1000 0000 0000 0000 0000 0000 0000 0000two = –2,147,483,648ten

1000 0000 0000 0000 0000 0000 0000 0001two = –2,147,483,647ten

1000 0000 0000 0000 0000 0000 0000 0010two = –2,147,483,646ten

... ...

1111 1111 1111 1111 1111 1111 1111 1101two = –3ten

1111 1111 1111 1111 1111 1111 1111 1110two = –2ten

1111 1111 1111 1111 1111 1111 1111 1111two = –1ten

Page 6: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

6

Một nửa của những con số trên, từ 0 tới 2,147,483,647ten(231– 1), dùng cách biểu diễn như trước đây. Những kiểu

bit phía sau (từ 1000 . . . 0000two) biểu diễn hầu hết các số âm từ –2,147,483,647ten(1000 . . . 0001two) tới –1ten (1111 . . . 1111two).

Cách biểu diễn “bù 2” vẫn có một con số âm, –2,147,483,648ten, số mà không có số dương tương ứng với nó. Sự thiếu cân bằng trên là một mối lo ngại đối với những lập trình viên lơ đễnh, nhưng mà cách cũ – “dấu và độ lớn” thì có vấn đề cho cả lập trình viên và người thiết kế phần cứng. Do đó, các máy tính thời nay đều dùng biểu diễn “bù 2” cho số có dấu.

Cách biểu diễn “bù 2” có một thuận lợi rằng tất cả các số âm có một bit 1 trong những bit bên trái cùng. Kết quả là, phần cứng cần chỉ cần phải kiểm tra bit này để xem số tương ứng là dương hay âm ( 0 được giả định là dương). Bit này được gọi là bit dấu (sign bit). Bằng cách nhận thấy được vai trò của bit dấu, chúng ta có thể biểu diễn số dương và số âm 32 bit như sau:

(x31 x –231) + (x30 x 230) + (x 29 x 229) + . . . + (x1 x 21) + (x0 x 20)

Bit dấu được nhân với –231, và phần bit còn lại thì được nhân với phiên bản dương của giá trị tương ứng.

Giống như một phép tính trên số không dấu có thể gây tràn bộ nhớ khi biểu diễn kết quả, phép tính trên số bù 2

cũng có thể xảy ra tương tự. Tràn bộ nhớ có thể xảy ra khi bit bên trái cùng của mã nhị phân thì không giống như những dãy số vô hạn ở bên trái (nghĩa là bit dấu không đúng) : một số 0 ở bên trái khi số là một số âm hay một số 1 khi số là số dương.

Bài tập

Đáp án

Chuyển đổi từ nhị phân sang thập phân

Giá trị thập phân của số bù 2 (32-bit) sau là gì?

1111 1111 1111 1111 1111 1111 1111 1100two

Tính toán theo mẫu sau:

(1 x –231) + (1 x 230) + (1 x 229) + . . . + (1 x 22) + (0 x 21) + (0 x 20)

= –231 + 230 + 229 + . . . + 22 + 0 + 0

= –2,147,483,648ten + 2,147,483,644ten

= – 4ten

Chúng ta sẽ thấy cách rút gọn hơn sau.

Page 7: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

7

Hardware Software Interface

Số có dấu và không dấu áp dụng khác nhau trong phép toán. Một hàm để load số có dấu thì sao chép biến dấu một cách lặp đi lặp lại để điền kín chỗ của register – gọi là sign extension – nhưng mục đích của nó là để đặt đúng cách biểu diễn trong register đó. Còn hàm để load số không dấu thì chỉ đơn giản là đặt tất cả các số 0 vào phần bên trái của dữ liệu, do số được biểu diễn bởi số không dấu.

Khi load một số 32-bit vào register 32 – bit, vấn đề thì phải bàn cãi; cách load số có dấu và không dấu thì giống nhau?. MIPS hỗ trợ 2 cách để load byte vào: load byte (lb) xử lý từng byte như một số có dấu và do đó sign-extend ( mở rộng dấu) để lấp đầy 24 bit còn lại; trong khi load byte unsigned (lbu) hoạt động như một biến nguyên không dấu. Vì chương trình C gần như luôn luôn dùng bytes để biểu diễn kí tự hơn là xem bytes như những biến nguyên không dấu rất ngắn, thực tế lbu thì được dùng khi không muốn giá trị của các bit còn lại giống bit dấu

Page 8: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

8

Hardware Software Interface

Bài tập

Tương tự như thế, load half (lh) xử lý những halfword (16-bit) như một số có dấu và sign-extend ( mở rộng dấu) để lấp đầy 16 bit còn lại, trong khi load half work unsigned (lhu) hoạt động với biến nguyên không dấu.

Không giống như những số được nói ở trên, địa chỉ ô nhớ (memory addresses) thường bắt đầu bởi số 0 và tiếp tục tới địa chỉ lớn nhất. Nói cách khác, ta không hề có địa chỉ âm. Do đó, chương trình thỉnh thoảng sẽ muốn xử lý số có thể âm hoặc dương và đôi khi chỉ muốn xử lý số dương. Một vài ngôn ngữ lập trình phản ánh sự khác biệt này. C – là một ví dụ - chia ra integers ( khai báo như int trong chương trình) và unsigned integers ( unsigned int). Một vài phong cách lập trình C còn khai báo signed int cho rõ ràng. Những chỉ thị (instructions) so sánh phải xử lý sự phân biệt này. Một kiểu bit mà có số 1 như là số có nghĩa nhất – đại diện một số âm – và tất nhiên, sẽ nhỏ hơn bất kì một số dương nào – có số 0 như số có nghĩa nhất. Với những số nguyên không dấu thì khác, số có số 1 như là số có nghĩa nhất sẽ lớn hơn bất kì số nào bắt đầu bằng một số 0.( chúng ta sẽ tận dụng việc 2 nghĩa này của bit có nghĩa nhất để giảm chi phí của việc kiểm tra giới hạn chuỗi trong vài trang nữa ?).

MIPS còn đưa ra 2 phiên bản của phép so sánh “set on less than” để giải quyết sự thay thế này . Set on less than (slt) and set on less than immediate (slti) hoạt động với số nguyên có dấu. Số nguyên không dấu thì được so sánh bằng set on less than unsigned (sltu) and set on less than immediate unsigned (sltiu).

So sánh có dấu >< So sánh không dấu

Giả sử register $s0 chứa dãy nhị phân

1111 1111 1111 1111 1111 1111 1111 1111two

Và register $s1 chứa dãy nhị phân

0000 0000 0000 0000 0000 0000 0000 0001two

Giá trị của register $t0 và $t1 sau 2 instruction này sẽ là gì

slt $t0, $s0, $s1 # signed comparison

sltu $t1, $s0, $s1 # unsigned comparison

Page 9: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

9

Trước khi đi tới phép tính cộng và trừ, hãy thử vài các làm tắt khi làm việc với số bù 2.

Cách làm tắt(short cut) đầu tiên là một cách nhanh để làm âm một số nhị phân dạng bù 2. Cách đơn giản là đảo ngược các bit 0 thành 1 và các bit 1 thành 0, sau đó cộng 1 vào kết quả. Cách làm tắt này thì dựa trên sự quan sát thấy rằng tổng của một số và nghịch đảo của nó sẽ là 111 . . . 111two – đại diện cho -1. Vì x + x= –1, do đó:

x + x + 1 = 0 or x + 1 = –x.

Đáp án

Bài tập

Đáp án

Giá trị trong register $s0 biểu diễn – 1 nếu nó là một biến nguyên và 4,294,967,295ten nếu nó là một biến nguyên không dấu.

Giá trị trong register $s1 biểu diễn 1 trong cả 2 trường hợp. Do đó, register $t0 sẽ có giá trị là 1 (vì –1ten< 1ten) và register $t1 sẽ có giá trị 0 (vì 4,294,967,295ten > 1ten)

Cách ngắn gọn biểu diễn số âm :

Hãy làm âm số 2ten và sau đó kiểm tra kết quả bằng cách làm âm số –2ten.

2ten = 0000 0000 0000 0000 0000 0000 0000 0010two

Đảo các bit và cộng kết quả cho 1:

1111 1111 1111 1111 1111 1111 1111 1101two

+ 1two

= 1111 1111 1111 1111 1111 1111 1111 1110two

= –2ten

Kiểm tra bằng cách làm âm số –2ten :

1111 1111 1111 1111 1111 1111 1111 1110two

Đảo các bit và cộng kết quả cho 1:

0000 0000 0000 0000 0000 0000 0000 0001two

+ 1two

= 0000 0000 0000 0000 0000 0000 0000 0010two

= 2ten

Page 10: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

10

Cách làm tắt (shortcut) thứ hai giới thiệu cho chúng ta cách để chuyển một số nhị phân đại diện bằng n bits thành một số đại diện với nhiều hơn n bits. Ví dụ: Trường tức thời (immediate field) trong các chỉ thị (instructions) load, store, branch, add, và set on less than chứa một số bù 2 (16-bit), đại diện số từ –32,768ten (–215) to 32,767ten (2

15 – 1). Đề cộng tức thời với một register 32-bit, máy tính phải chuyển số 16-bit thành số 32-bit tương đương. Cách làm để lấy những bit có nghĩa nhất từ một số nhỏ – bit dấu – và sao chép nó để lấp đầy những bit mới trong số lớn hơn. Những bit cũ thì đơn giản chỉ là sao chép vào phần bên phải của số mới. Cách làm tắt này thường được gọi là mở rộng dấu (sign extension) .

Kĩ thuật này hoạt động bởi vì số bù 2 dương có một dãy vô hạn các số 0 ở bên trái và số bù 2 âm có một dãy vô hạn các số 1. Kiểu bit nhị phân đại diện một số thì dấu đi những bit dẫn đầu để vừa với độ rộng của phần cứng; việc mở rộng bit dấu chỉ đơn giản là phục hồi chúng trở lại.

Bài tập

Đáp án

Cách mở rộng dấu:

Chuyển đổi số 16-bit của 2ten và –2ten thành số 32-bit

Phiên bản 16-bit của số 2 là:

0000 0000 0000 0010two = 2ten

Số này được chuyển thành số 32-bit bằng cách sao chép 16 giá trị của bit có nghĩa nhất (bit dấu) (0) và đặt nó vào nửa bên trái của số. Nửa bên phải là giá trị cũ.

0000 0000 0000 0000 0000 0000 0000 0010two = 2ten

Bây giờ hãy làm âm phiên bản 16-bit của số 2 bằng cách làm trước. Do đó

0000 0000 0000 0010two

trở thành:

1111 1111 1111 1101two

+ 1two

= 1111 1111 1111 1110two

Tạo phiên bản 32- bit của số âm bằng cách sao chép bit dấu 16 lần và đặt nó vào bên trái:

1111 1111 1111 1111 1111 1111 1111 1110two = –2ten

Page 11: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

11

Cách làm tắt (shortcut) thứ ba giảm chi phí của việc kiểm tra 0 x < y, trong việc kiểm tra giới hạn của một dãy số. Chìa khoá là số nguyên âm trong kiểu bù 2 thì giống như là một số lớn trong kiểu không dấu; do bit có nghĩa nhất là bit dấu trong kiểu đầu nhưng lại là một phần lớn của số ở trong kiểu sau. Do đó, việc kiểm tra số không dấu x < y cũng chính là kiểm tra xem x có âm hay không.

Tóm tắt: Ý chính của mục 3.2 này là chúng ta cần thể hiện cả biến dương và âm trong một từ của máy tính và dù tán thành hay phản đối thì sự lựa chọn từ năm 1965 là sử dụng phép bù 2.

Hình 3.1 nói thêm về ngôn ngữ hợp ngữ MIPS đã được nói tới trong mục này.

Bài tập

Đáp án

Check Yourself

Kiểm tra giới hạn:

Dùng cách trên để giảm chi phí cho việc kiểm tra giới hạn : nhảy (jump) đến Index-OutOfBounds nếu $a1≥ $t2 hay nếu $a1 âm.

Code kiểm tra chỉ dùng sltu để làm cả hai việc kiểm tra:

sltu $t0,$a1,$t2 # reg tạm $t0 = 0 nếu k >= độ dài chuỗi or k<0

beq $t0,$zero,IndexOutOfBounds # Nếu $t0 = 0 thì nhảy tới IndexOutOfBounds

Loại biển nào có thể chưa số mà chiếm bộ nhớ nhất?

1. int in C 2. string in C 3. string in Java (which uses Unicode)

Page 12: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

12

MIPS operands

Name Example Comments

32 registers

$s0–$s7, $t0–$t9, $gp, $fp, $zero, $sp, $ra, $at

Fast locations for data. In MIPS, data must be in registers to perform arithmetic. MIPS register $zero always equals 0. Register $at is reserved for the assembler to handle large constants.

230 memory words

Memory[0], Memory[4], . . . , Memory[4294967292]

Accessed only by data transfer instructions. MIPS uses byte addresses, so sequential word addresses differ by 4. Memory holds data structures, such as arrays, and spilled registers, such as those saved on procedure calls

MIPS assembly language

Category Instruction Example Meaning Comments

Arithmetic

add add $s1,$s2,$s3 subtract sub $s1,$s2,$s3

add immediate

addi $s1,$s2,100

Data transfer

Load word lw $s1,100($s2) Store word sw $s1,100($s2)

Load half unsigned lhu $s1,100($s2) Store half sh $s1,100($s2)

Load byte unsigned lbu $s1,100($s2) Store byte sb $s1,100($s2)

Load upper immediate lui $s1,100

Logical

And and $s1,$s2,$s3 Or or $s1,$s2,$s3 Not nor $s1,$s2,$s3

Add immediate andi $s1,$s2,100 Or immediate ori $s1,$s2,100

Shift left logical sll $s1,$s2,10 Shift right logical srl $s1,$s2,10

Conditional branch

Branch on equal beq $s1,$s2,25 Branch on not equal bne $s1,$s2,25

Set on less than slt $s1,$s2,$s3 Set on less than immediate slti $s1,$s2,100 Set on less than unsigned sltu $s1,$s2,$s3

Set on less than immediate unisnged

sltiu $s1,$s2,100

Uncondi- tional jump

Jump Jump register Jump and link

Page 13: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

13

Chi tiết hơn: Bù hai được lấy tên từ luật rằng tổng không dấu của một số n-bit và số âm của nó là 2n; do đó, phần bù hay số âm của một số bù 2 x sẽ là 2n – x.

Một cách biểu diễn thay thế thứ ba là “Bù một”. Số âm của một số bù một được tính bằng cách đảo ngược các bit, từ 0 sang 1 và từ 1 sang 0, điều này giải thích tên của nó vì phần bù của x là 2n – x – 1. Đó cũng đã là một sự cố gắng để tìm giải pháp tốt hơn cho phép “dấu và độ lớn” và nhiều máy tính đã dùng các bù một này. Cách biểu diễn này cũng tương tự với bù hai ngoại trừ rằng nó vẫn còn hai số 0: 00 . . . 00two là số dương 0 và 11 . . . 11two là số âm 0. Số âm lớn nhất là 10 . . . 000two đại diện cho –2,147,483,647ten và do đó số dương và số âm thì cân bằng nhau. Bù một cần thêm một bước phụ nữa để trừ một số. Do đó, bù hai chiếm ưu thế hơn.

Cách biểu diễn cuối cùng – chúng ta sẽ tìm hiểu kĩ hơn trong phần dấu chấm động – là đề biểu diễn số âm nhất bởi 00 . . . 000two và số dương nhất bởi 11. . . 11two, và 0 thì có giá trị là 10 . . . 00two. Đây gọi là biased notation . since it biases the number such that the number plus the bias has a nonneg-ative representation ( dịch không được ).

Chi tiết hơn: Đối với số thập phân có dấu, chúng ta dùng dấu “ – “ để biểu diễn số âm bởi vì không có giới hạn kích thước của một số thập phân. Khi có một kích thước cố định, những dãy bit nhị phân và thập lục phân có thể mã hoá dấu, do đó, chúng ta thường không dùng dấu “+” hay “–” với biểu diễn nhị phân và thập lục phân.

Phép cộng là rất cần thiết trong một máy tính. Những con số có thể được cộng từng bit một từ phải sang trái, với “phần nhớ” được chuyển qua cho số tiếp theo bên trái, như chúng ta làm bằng tay.

Phép trừ thì dùng phép cộng: đơn giản là cộng với số âm

3.3 Phép tính cộng và trừ

Bài tập Phép cộng và trừ nhị phân

Hãy thử cộng 6ten cho 7ten trong nhị phân và sau đó lấy 7ten trừ cho 6ten trong nhị phân

Page 14: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

14

Chúng ta đã nói trước đây rằng việc tràn bộ nhớ có thể xảy ra khi kết quả của phép tính thì không thể hiện được bởi phần cứng, trong trường hợp này là 32-bit. Vậy khi nào thì tràn bộ nhớ sẽ xảy ra trong lúc cộng?

Khi cộng với số khác dấu, tràn bộ nhớ (overflow) không thể xảy ra. Kết quả của phép cộng không thể nào lớn hơn một trong hai toán hạng. Ví dụ –10 + 4 = –6 . Do đó, kết quả thì chứa đủ trong 32 bits.

Ràng buộc với tràn bộ nhớ trong phép trừ cũng tương tự, nhưng nó chỉ là nguyên lý ngược lại: khi dấu của toán hạng giống nhau, tràn bộ nhớ không thể xảy ra. Để hiểu điều này x – y = x + (–y): bởi vì trừ bằng cách làm âm toán hạng thứ hai sau đó cộng lại. Do đó, khi chúng ta trừ toán hạng có cùng dấu, chúng ta đi tới việc cộng toán tử khác dấu. Từ đoạn trước, chúng ta biết rằng tràn bộ nhớ không thể xảy ra trong cả hai trường hợp.

Chúng ta đã kiểm tra thử khi nào tràn bộ nhớ không thể xảy ra trong phép trừ và phép cộng, chúng ta vẫn chưa có câu trả lời rằng : làm sao để nhận thấy được tràn bộ nhớ đã xảy ra. Tràn bộ nhớ xảy ra khi chúng ta cộng hai số dương và kết quả là số âm hoặc ngược lại. Rõ ràng là, khi cộng hoặc trừ hai số 32-bit tạo ra một kết quả mà cần tới 33 bit để biểu diễn. Việc thiếu đi bit thứ 33 nghĩa là tràn bộ nhớ đã xảy ra. Do chúng ta cần thêm một bit, chỉ có bit dấu bị sai. Điều này có nghĩa là tràn bộ nhớ tiến hành trên bit dấu.

Tràn bộ nhớ xảy ra trong phép trừ khi chúng ta trừ lấy số dương trừ cho số âm và kết quả là một số âm hay khi chúng ta lấy số âm trừ một số dương và kết quả là một số dương. Hình 3.3 sẽ đưa ra các trường hợp có thể xảy ra tràn bộ nhớ.

Đáp án Phép cộng:

0000 0000 0000 0000 0000 0000 0000 0111two = 7ten

+ 0000 0000 0000 0000 0000 0000 0000 0110two = 6ten

= 0000 0000 0000 0000 0000 0000 0000 1101two = 13ten

Phép trừ có thể làm trực tiếp như sau:

0000 0000 0000 0000 0000 0000 0000 0111two = 7ten

– 0000 0000 0000 0000 0000 0000 0000 0110two = 6ten

= 0000 0000 0000 0000 0000 0000 0000 0001two = 1ten

Hoặc là cộng với số bù 2 của 6

0000 0000 0000 0000 0000 0000 0000 0111two = 7ten

+ 1111 1111 1111 1111 1111 1111 1111 1010two = –6ten

= 0000 0000 0000 0000 0000 0000 0000 0001two = 1ten

Page 15: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

15

Operation

Operand A Operand B Result indicating overflow

A + B

0 0 < 0

A + B

< 0

< 0

0

A – B

0 < 0

< 0

A – B

< 0

0 0

Hình 3.3: các trường hợp có thể xảy ra tràn bộ nhớ

Chúng ta đã thấy cách nhận biết tràn bộ nhớ cho những số bù hai trong máy tính. Thế còn những số nguyên không dấu thì thế nào ? Số nguyên không dấu thì thường dùng cho địa chỉ của bộ nhớ, nơi mà tràn bộ nhớ có thể được lờ đi.

Nhà thiết kế máy tính do đó cung cấp một cách để lờ đi tràn bộ nhớ trong một số trườn hợp và nhận biết chúng trong những trường hợp khác. Giải pháp của MIPS là có hai chỉ thị (instructions) toán học để đưa ra 2 lựa chọn:

Add (add), add immediate (addi), và subtract (sub) gây ra những ngoại lệ (exceptions) trong tràn bộ nhớ (overflow)

Add unsigned (addu), add immediate unsigned (addiu), and subtract unsigned (subu) không gây ra những ngoại lệ (exceptions) trong tràn bộ nhớ (overflow)

Bởi vì C bỏ qua trường hợp tràn bộ nhớ, trình biên dịch MIPS C sẽ luôn tạo ra một phiên bản không dấu có các chỉ thị (instructions) cộng addu, addiu và subu bất kể loại dữ liệu nào. Trình biên dịch MIPS Fortran thì chọn những chỉ thị (instructions) phụ thuộc và loại dữ liệu của toán hạng.

Hardware Software Interface

Nhà thiết kế máy tính phải quyết định làm thế nào để xử lý tràn bộ nhớ khi tính toán. Mặc dù vài ngôn ngữ như C thì lờ đi tràn bộ nhớ biến nguyên, ngôn ngữ như Ada và Fortran thì yêu cầu chương trình phải chú ý. Người lập trình hoặc môi trường lập trình phải quyết định phải làm gì khi tràn bộ nhớ xảy ra.

MIPS nhận tràn bộ nhớ (overflow) như một sự ngoại lệ (exception), còn được gọi là sự gián đoạn (interrrupt) đối với nhiều máy. Một sự ngoại lệ hay một sự gián đoạn về cơ bản là một sự gọi hàm không mong đợi.

Địa chỉ của chỉ thị (instruction) bị tràn bộ nhớ sẽ được lưu trữ trong một register, và máy tính sẽ nhảy tới một địa chỉ được định nghĩa trước để yêu cầu một thủ tục phù hợp cho sự ngoại lệ đó. Địa chỉ của chỉ thị bị gián đoạn sẽ được lưu lại để trong một số trường hợp, chương trình có thể hoạt động tiếp tục sau khi đoạn chương trình đúng được chạy. (Các chương sau sẽ nói rõ hơn).

Page 16: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

16

Tóm tắt:

Ý chính của mục là – sự tự do trong sự biểu diễn – kích thước có hạn của một số trong máy tính nghĩa là một phép toán có thể tạo ra kết quả quá lớn để lưu vừa vào một kích thước số cố định. Ta dễ để xác định sự tràn bộ nhớ trong các số không dấu, mặc dầu chúng gần như luôn được lờ đi bởi vì chương trình không muốn xác định sự tràn bộ nhớ cho phép tính địa chỉ, việc dùng thông dụng nhất với số tự nhiên. Số bù hai đưa ra một thách thức lớn, mặc dù vài hệ thống phần mềm cần việc xác định tràn bộ nhớ, nên vào thời điểm này, tất cả máy tính đều có một cách để xác định nó . Hình 3.4 đưa ra bổ sung cho cấu trúc MIPS.

Soạn chi tiết: Trong đoạn trước, chúng ta đã nói rằng bạn sao chép EPC vào một register thông qua mfc0 và sau đó trở về đoạn code bị gián đoạn thông qua một chỉ thị jump register. Điều này dẫn tới một câu hỏi thú vị: Đầu tiên bạn phải chuyển giá trị EPC vào trong một register để dùng với jump register, làm thế nào để jump register có thể trở về đoạn có bị gián đoạn và phục hồi giạ trị gốc của tất cả các register? Bạn có thể phục hồi giá trị register cũ trước và sau đó xoá giá trị trả về của EPC mà bạn đã dùng để lưu trong một register để jump, hoặc là bạn có thể phục hồi tất cả register trừ register có chứa địa chỉ trở về để bạn jump! Không lựa chọn nào trong đó thì thoả mãn cả.

Để cứu phần cứng khỏi tình trạng tiến thoái lưỡng nan này, lập trình viên MIPS đã đồng ý để đảo ngược register $k0 và $k1 cho hệ điều hành; những register này thì không được phục hồi trong sự gián đoạn ( hay sự ngoại lệ). Cũng như trình biên dịch MIPS tránh dùng register $at để assembler có thể dùng nó như một register tạm, trình biên dịch cũng tránh dùng register $k0 và $k1 để làm chúng khả dụng cho hệ điều hành.

MIPS có một register gọi là exception program counter (EPC) để chứa địa chỉ của chỉ thị mà tạo ra sự ngoại lệ. Chỉ thị move from system control (mfc0) là được dùng để sao chép EPC vào một general-purpose register để phần mềm MIPS có sự lựa chọn để trở về thông qua một chỉ thị jump.

Check Yourself

Vài ngôn ngữ lập trình cho phép các phép toán số nguyên bù hai trong các biến được khai báo bytes và half. Chỉ thị MIPS nào có thể được dùng?

1. Load với lbu, lhu; tính toán với add, sub, mult, div; sau đó store dùng sb, sh.

2. Load với lb, lh; tính toán với add, sub, mult, div; và store dùng sb, sh. 3. Load với lb, lh; tính toán với add, sub, mult, div, dùng and để đánh dấu

kết quả tới 8 hoặc 16 bits sau mỗi lần chạy và sau đó lưu với sb, sh

Page 17: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

17

Chúng ta đã hoàn thành việc giải thích cho phép tính cộng và

phép trừ. Bây giờ chúng ta đã sẵn sàng để xây dựng một phép tính gây nhiều tranh cãi hơn – Phép nhân.

Đầu tiên chúng ta hãy ôn lại phép tính nhân cho số thập phân để nhắc nhở chúng ta về các bước và tên của các toán hạng. Để cho điều này trở nên đơn giản và rõ ràng hơn, chúng tôi giới hạn số thập phân trong ví dụ này chỉ có số 0 và 1. Nhân 1000ten với 1001ten:

Multiplicand 1000ten

Multiplier x 1001ten

1000

0000

0000

1000

Product 1001000ten

Toán hạng đầu tiên gọi là số bị nhân (multiplicand )và số thứ hai

gọi là số nhân (multiplier). Kết quả cuối cùng gọi là product. Như bạn có thể nhớ lại, thuật toán đã học được là lấy từng chữ số của số nhân từ phải sang trái, nhân với số bị nhân bằng một số của số nhân và dịch kết quả sang bên phải một chữ số.

Điều chúng ta thấy đầu tiên là số lượng chữ số của kết quả thì lớn hơn số lượng chữ số trong cả số nhân và số bị nhân. Trong thực tế, nếu chúng ta lờ đi bit dấu, chiều dài của phép nhân n-bit và m-bit thì có kết quả là n + m bits. Trong đó, n + m bit là số lượng cần thiết để biểu diễn tất cả các kết quả có thể có. Do đó, giống như cộng, phép nhân cần đối phó với việc tràn bộ nhớ, bởi vì chúng ta thường muốn một kết quả 32-bit như là kết quả của phép nhân 2 số 32 bit.

Mặc dù ví dụ thập phân trên chỉ dùng 0 và 1, phép nhân nhị phân thì luôn luôn phải dùng 0 và 1 và do đó, luôn chỉ có 2 sự lựa chọn.

3.4 Phép Nhân

Page 18: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

18

Bây giờ chúng ta đã ôn lại phép nhân cơ bản, bước tiếp theo là cung cấp một phần cứng có thể nhân một cách tối ưu. Chúng tôi tin tưởng rằng bạn sẽ hiểu sâu tốt hơn thông qua việc xem quá trình phát triển của máy tính nhân và thuật toán qua mỗi thế hệ của sự phát triển. Bây giờ, hãy giả sử rằng chúng ta chỉ nhân hai số dương.

Chuỗi các phiên bản của thuật toán nhân

Thiết kế này bắt chước thuật toán mà chúng ta đã học ở trường trung học – được thể hiện ở trong hình 3.5. Chúng tôi đã vẽ các phần cứng với dữ liệu chảy từ trên xuống để giống với cách bút-và-giấy.

Hãy giả sử rằng số nhân ở trong một register nhân(Multiplier) 32-bit và register kết quả 64-bit(Product) được khởi gán là 0. Từ ví dụ ở trên, rõ ràng là chúng ta sẽ cần phải dịch chuyển số bị nhân sang bên trái một số trong mỗi bước để nó sẽ được cộng vào kết quả trung gian. Qua 32 bước, một số bị nhân 32-bit sẽ được dịch chuyển sang trái 32 bit. Do đó chúng ta cần một register bị nhân (multiplicand) 64-bit, khởi gián với 32-bit số bị nhân ở nửa bên phải và 0 ở nửa bên trái. Register này khi đó đã được dịch chuyển sang trái 1 bit mỗi bước để dóng hàng số bị nhân với phép cộng tích luỹ thành register kết quả 64-bit.

Page 19: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

19

Hình 3.6 sẽ cho thấy 3 bước cơ bản cần thiết cho mỗi bit. Bit ít có nghĩa nhất của số nhân (Multiplier0) quyết định rằng liệu số bị nhân có được cộng vào trong register Product hay không?. Phép dịch bit ở bước 2 có nhiệm vụ di chuyển toán hạn trung gian sang bên trái, như khi nhân bằng tay. Phép dịch bit sang phải trong bước 3 cho chúng ta lấy bit tiếp theo của số nhân để kiểm tra trong vòng lặp kế tiếp. 3 bước này được lặp đi lặp lại 32 lần để thu được kết quả. Nếu mỗi bước tốn một clock cycle, thuật toán này sẽ cần khoảng 100 clock cycles để nhân hai số 32-bit. Mức độ xuất hiện của phép nhân thì khác nhau giữa các chương trình, nhưng phép cộng và hép trừ thì có thể thấy ở bất cứ đầu với tần số xuất hiện cao hơn từ 5 tới 100 lần so với phép nhân. Cho nên, trong nhiều chương trình, phép nhân tốn nhiều clock cycle mà không có ảnh hưởng có lợi cho hiệu suất chương trình.

Page 20: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

20

Thuật toán này có thể dễ dàng cả tiến để chỉ tốn 1 clock cycle mỗi bước. Việc tăng tốc do việc thực hiện các lệnh song song: số bị nhân và số nhân được dịch bit trong khi số bị nhân được cộng vào kết quả nếu bit của số nhân là 1. Phần cứng chỉ phải đảm bảo rằng nó kiểm tra đúng bit của số nhân và lấy phiên bản trước khi bị dịch bit của số bị nhân. Phần cứng thì thường được tối ưu hơn để chia đều độ rộng của phép cộng và register bằng cách để ý nơi nào các register được bỏ trống. Hình 3.7 chỉ ra thuật toán tối ưu .

Hardware Software Interface

Bài tập

Thay thế thuật toán bằng cách dịch bit cũng có thể xảy ra khi nhân với một hằng số. Bởi vì một bit bên trái đại diện một số lớn hơn gấp 2 lần trong nhị phân, dịch bit sang trái cũng có nghĩa là nhân số cho 2.

Thuật toán nhân.

Dùng những số 4 bit để tiết kiệm dung lượng, hãy nhân 2ten x 3ten, or 0010twox0011two

Page 21: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

21

(Translater: chỗ này mình sửa lại đáp án theo cách làm của thầy Tuấn Nam)

Bước lặp Số nhân (Multiplier)

Số bị nhân (Multiplicand)

Kết quả (Product)

0011 0000 0010 0000 0000 1 0001 0000 0100 0000 0010 2 0000 0000 1000 0000 0110 3 0000 0001 0000 0000 0110 4 0000 0010 0000 0000 0110

Phép nhân số có dấu (//phần này dịch không kĩ lắm)

Chúng ta đã xử lý với số nhị phân. Cách dễ nhất để hiểu làm sao để xử lý số có dầu là đầu tiên chuyển số nhân và số bị nhân thành số dương và lưu lại dấu. Thuật toán này khi đó sẽ chỉ chạy 31 lần. Như chúng ta đã học ở trung học, chúng ta cần làm âm kết quả nếu mà các dấu ban đầu không giống nhau. Điều đó đưa tới thuật toán cuối cùng sẽ hoạt động với số có dấu. Chúng ta nên nhớ rằng các số mà chúng ta đang xử lý thì có một số lượng hữu hạn các con số và chúng ta chỉ biểu diễn chúng với 32 bits. Do đó, các bước dịch bit sẽ cần phải mở rộng dấu của kết quả cho các số có dấu. Khi thuật toán hoàn thành, các số sẽ có kết quả 32 bit

Phép nhân nhanh (Faster Multiplication)

Moore’s Law đã cung cấp nhiều tài nguyên để các nhà thiết kế phần cứng có thể xây dựng một phần cứng nhân nhanh hơn. Số bị nhân có được cộng vào hay không thì được biết vào đầu của phép nhân bằng cách nhìn vào mỗi 32 bit của số nhân. Phép nhân nhanh hoạt động bằng cách cung cấp một đơn vị cộng 32-bit cho mỗi bit của số nhân: một đầu vào là số bị nhân đã AND với một bit số bị nhân; đầu vào còn lại là kết quả của phép cộng trước. Hình 3.9 sẽ cho thấy chúng hoạt động như thế nào.

Tại sao thuật toán này nhanh hơn?

# Đoạn này chưa dịch hoàn chỉnh , mong được sự đóng góp của các bạn

The sequential multiplier pays the overhead of a clock for each bit of the product. This multiplier array of adders does not. A second reason is this large collection of adders lends itself to many optimizations to gain further improvements. One example is using carry save adders to add such a large column of numbers; see Exercises 3.24 and 3.49. A third reason is that it is easy to pipeline such a design to be able to support many multiplies simulta-neously (see Chapter 6).

#

Đáp án

Page 22: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

22

Phép nhân trong MIPS

MIPS cung cấp một cặp register 32-bit riêng biệt để chứa kết quả 64-bit – gọi là Hi và Lo. Để tạo ra một kết quả có dấu hoặc không dấu phù hợp, MIPS có hai chỉ thị(instruction) : multiply (mult) và multiply unsigned (multu). Để lấy kết quả 32-bit nguyên, người lập trình dùng move from lo (mflo). Trình assember MIPS sẽ tạo một chỉ thị giả (pseudoinstruction) để nhân. Và tạo chỉ thị mflo và mfhi để đặt kết quả vào trong register.

Tóm tắt:

Phép nhân có thể được thực hiện đơn giản bằng việc dịch bit và cộng – bắt nguồn từ phép nhân cơ bản đã học ở trung học. Trình biên dịch còn có thể dùng chỉ thị dịch bi để nhân cho bội số của hai.

Hardware Software Interface

Các chỉ thị(instruction) nhân của MIPS thì lờ đi sự tràn bộ nhớ, do đó , nó phụ thuộc vào phần mềm để kiểm tra xem liệu kết quả có quá lớn để chứa trong 32 bits. Sẽ không có tràn bộ nhớ nếu Hi là 0 cho mulu hoặc các bit dấu đã được sao chép của Lo cho mult. Chỉ thị move from hi (mfhi)có thể được dùng để chuyển Hi vào một register chung để kiểm tra overflow.

Page 23: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

23

Page 24: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

24

Phép toán đảo của phép nhân là phép chia, một phép toán thậm chí còn ít dùng hơn và đôi khi còn kỳ quặc. Nó thậm chí còn đưa ra cơ hội để tạo ra một phép tính không đúng: chia cho 0.

Hãy bắt đầu bằng một ví dụ của phép chia trong hệ thập phân để gợi nhớ lại tên của các toán hạng và thuật toán chia đã học ở trung học. Nhằm đơn giản, chúng tôi giới hạn số thập phân chỉ dùng 0 và 1. Ví dụ này sẽ chia 1,001,010ten by 1000ten:

1001ten Quotient

Divisor 1000ten 1001010ten Dividend –1000

10 101 1010

–1000

10ten Remainder

Hai toán hạng (Dividend: Số bị chia; và Divisor: Số chia) và kết quả (quotient) của phép chia, theo sau bởi kết quả thứ hai gọi là số dư( remainder). Một cách khác để biểu diễn mỗi quan hệ của các thành phần là:

Dividend = Quotient x Divisor + Remainder

Thuật toán chia cơ bản ở trường trung học cố để xem một số có thể bị trừ tới mức lớn như thế nào, tạo một số ở kết quả trong mỗi lần trừ. Số thập phân được chọn trong ví dụ chỉ dùng 0 và 1, nên dễ dàng để nhìn ra số bị chia có thể được chia bởi số chia bao nhiêu lần. Số nhị phân chứa chỉ có 0 hoặt 1 nên phép chia nhị phân thì giới hạn tới hai sự lựa chọn. Hãy giả sử rằng cả hai số chia và số bị chia đều dương và do đó, kết quả và số dư cũng dương. Các toán hạng của phép chia và kết quả đều là 32-bit và chúng ta đang lờ đi bit dấu.

Thuật toán và phần cứng cho một phép chia

Hình 3.10 thể hiện phần cứng để giả lập thuật toán chia ở trung học. Chúng ta bắt đầu với register kết quả 32-bit được đặt là 0. Mỗi lần lặp của thuật toán thì cần để di chuyển số chia sang phải một chữ số, nên chúng ta bắt đầu với số chia được đặt trong nữa phải của register số chia 64 bit và dịch nó sang phải một bit mỗi bước để dóng hàng với số bị chia. Register chứa số dư thì được khởi gán với số bị chia. Hình 3.11 thể hiện 3 bước của thuật toán chia thứ nhất. Không giống như con người, máy tính không đủ thông minh để biết trước là liệu số chia có nhỏ hơn số bị chia hay không. Nó đầu tiên phải trừ số chia trong bước 1; nhớ rằng đây là cách chúng ta thực hiện phép so sánh trong chỉ thị (instruction) set on less than. Nếu kết quả là dương thì số chia nhỏ hơn hoặc bằng số bị chia nên chúng ta tạo một bit 1 ở trong kết quả (bước 2a). Nếu kết quả là âm, bước kế tiếp là để phục hồi lại giá trị cũ bằng cách cộng số chia trở lại số dư và tạo một số 0 ở kết

3.5 Phép Chia

Divisor: Số chia

Quotient : Kết quả

Dividend: Số bị chia

Remainder: số dư

Page 25: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

25

quả (bước 2b). Số chia thì được dịch bit sang phải và khi đó chúng ta lặp lại . Số dư và kết quả sẽ được tìm thấy ở register trùng tên sau khi quá trình lặp kết thúc.

Page 26: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

26

Page 27: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

27

(Translater: chỗ này mình sửa lại đáp án theo cách làm của thầy Tuấn Nam)

Step Remainder Divisor Quotent 0000 0111 0010 0000 0000 0000 1 0000 0111 0001 0000 0000 0000 2 0000 0111 0000 1000 0000 0000 3 0000 0111 0000 0100 0000 0000 4 0000 0011 0000 0010 0000 0001 5 0000 0001 0000 0001 0000 0011

Bài tập

Đáp án

Thuật toán chia

Dùng phiên bản 4bit của thuật toán để tiết kiệm giấy, hãy cố chia 7ten cho 2ten, hoặc 0000 0111two by 0010two.

Page 28: Sohoctrongmaytinh50%

More information: www.itspiritclub.net Số học trong máy tính Translater: huahongquan2007

28

Phép chia có dấu

Từ đầu tới giờ chúng ta đã lờ đi phép chia với số có dấu. Giải pháp đơn giản nhất là nhớ dấu của số bị chia và số chia sau đó làm âm giá trị của kết quả nên dấu không giống nhau.

Soạn chi tiết:

Khó khăn thức nhất của phép chia có dấu là chúng ta cũng phải đặt dấu cho số dư. Nhớ rằng công thức sau vẫn phải đúng:

Dividend = Quotient x Divisor + Remainder

Để hiểu được làm sao đặt dấu cho số dư, hãy thử xem ví dụ của chia tất cả trường hợp có thể của ±7ten cho ±2ten. Trường hợp đầu thì đơn giản:

+7 / +2: Quotient = +3, Remainder = +1

Kiểm tra kết quả:

7 = 3 x 2 + (+1) = 6 + 1

Nếu chúng ta thay đổi dấu của số bị chia, kết quả cũng phải thay đổi :

–7 / +2: Quotient = –3

Viết lại công thức cơ bản của chúng ta để tính toán số dư:

Remainder = Dividend – Quotient x Divisor= – 7 – –3 x+2= –7––6) = -1

Vậy:

–7 +2 : Quotient = –3, Remainder = –1

Kiểm tra kết quả:

–7 = –3 x2 + (–1) = –6 – 1