o Biểu diễn số nguyên trong máy tính.
Trong máy tính mọi dữ liệu đều được lưu trữ bằng các tín hiệu nhò phân. Mô hình toán
học tương ứng cho cách lưu trữ đó là số học hệ đếm nhò phân. Trong hệ đếm này các dữ liệu
được biểu diễn bằng một dãy các số 0 và 1. Hơn nữa tài nguyên của máy tính là hữu hạn, các
thanh ghi của bộ xử lí hay chiều dài mỗi đơn vò bộ nhớ là hữu hạn, vì vậy ta chỉ xét đến cách
biểu diễn số bằng các thanh ghi có chiều dài hữu hạn mà thôi. Mặt khác với cùng một biểu diễn
nhò phân, các cách xử lí khác nhau đối với biểu diễn này sẽ cho ý nghóa dữ liệu khác nhau. Ví
dụ: Trong máy tính biểu diễn 0100 0001 có thể là số thập phân 65 hay là kí tự ‘A’ tuỳ theo cách
xử lí đối với biểu diễn này. Từ đó ta có khái niệm “Kiểu dữ liệu – Data type”: Một kiểu dữ liệu
là một cách biểu diễn dữ liệu trong máy tính đi kèm với phương thức mà máy tính xử lí cách biểu
diễn đó.
Để dễ dàng cho việc lập luận, sau đây ta giả sử dữ liệu được biểu diễn bằng một thanh
ghi 4 bit trong một máy tính giả đònh .
Kiểu số nguyên không dấu:
Trước tiên ta xem xét cách biểu diễn số nguyên trong hệ thập phân (Decimal system).
Trong hệ thống này ta dùng 10 kí hiệu 0,1,2,3,4,5,6,7,8,9 và cách ghi theo thứ tự các chữ số để
biểu diễn giá trò số đó. Ví dụ:
75689 = 70000 + 5000 + 600 + 80 + 9
= 7.10
4
+ 5.10
3
+ 6.10
2
+ 8.10
1
+ 9.10
0
Tổng quát ta có:
01232n1nn
aaaa...aaa
−−
dec
=
∑
=
n
0i
i
i
10.a
trong đó:
∀
i=
n..0
: a
i
{ }
9,8,7,6,,5,,4,3,2,1,0∈
Với cùng nguyên tắc biểu diễn đó, trong hệ nhò phân (Binary system) ta chỉ dùng 2 kí
hiệu 0,1 để biểu diễn số nguyên như sau:
01232n1nn
aaaa...aaa
−−
bin
= (
∑
=
n
0i
i
i
2.a
)
dec
trong đó:
∀
i=
n..0
: a
i
{ }
1,0∈
Vậy trong hệ này, ta có:
101110
bin
=1.2
5
+ 0.2
4
+ 1.2
3
+ 1.2
2
+ 1.2
1
+ 0.2
0
dec
= (32+0+8+4+2+0)
dec
=46
dec.
Khác với biểu diễn số nguyên trong toán học, trong máy tính ta chỉ có thể dùng các thanh
ghi với độ dài hữu hạn để biểu diễn số nên phạm vi số nguyên biểu diễn được là hữu hạn. Chẳng
hạn với thanh ghi 4 bit ta chỉ có thể biểu diễn được các số:
Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Binary 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Một cách tổng quát với n bit thì có thể biểu diễn 2
n
số nguyên không dấu trong phạm vi từ số 0
đến 2
n
-1
dec
.
50
Kiểu số nguyên có dấu:
Chúng ta biết rằng các phép toán cơ bản +, - ,* , div đối với số nguyên trong số học đều có chung
một tính chất hết sức quan trọng là chúng đều “đóng kín” đối với các phép toán đó. Nghóa là với
hai số nguyên a và b bất kì ta đều có a+b, a-b, a.b, a div b đều là các số nguyên. Với cách biểu
diễn số nguyên không dấu trong máy tính như trên tính “đóng kín” không còn bảo toàn được
nữa, chẳng hạn:
- Tràn số : 7
dec
+10
dec
=0111
bin
+1010
bin
= ?
bin
(Tràn số. Không thể biểu diễn được với 4 bit)
- Không có cách biểu diễn: 7
dec
– 10
dec
= ? (Số âm).
Vấn đề tràn số không thể giải quyết được trừ khi phải mở rộng độ dài thanh ghi. Chẳng hạn, vì
2
15
–1 = 32767 < 60032 < 2
16
–1 = 65535 nên muốn biểu diễn số 60032
dec
ít nhất chiều dài của
thanh ghi phải là 16 bit. Nếu không mở rộng thanh ghi (nghóa là chuyển sang một kiểu dữ liệu
khác) kết quả tính toán có thể đem lại nhiều bất ngờ. Sử dụng lại ví dụ trên ta thấy phép cộng:
1 1
0 1 1 1
+
1 0 1 0
1 0 0 0 1
cho kết quả của phép cộng là: 0001. (Không đúng!)
Về vấn đề số âm :
Để khảo sát số âm trước hết chúng ta khảo sát phép trừ. Sử dụng cách trừ như thông thường với
phép trừ thực hiện lần lượt từ cột bên phải qua ta thấy rằng khi ta trừ 1 cho 0 ta được 1, trừ 1 cho
1 ta được 0 còn khi trừ 0 cho 1 ta cần “mượn” 1 từ cột kế cận bên trái là cột mà quá trình tính
toán chưa xét tới. Việc mượn 1 từ cột kế bên trái này có thể gây ra mượn dây chuyền từ cột này
qua các cột kế tiếp về phía bên trái
A B Hiệu số Mượn
0 0 0 0
0 1 1 1
1 0 1 0
1 1 0 0
Các ví dụ sau đây cho ta thấy quá trình đó đã lan truyền như thế nào:
51
Số phải nhớ đem từ cột bên phải qua
Số này không
thuộc thanh ghi
quảKết
trừSố
trừbòSố
trái cột bêntừ Mượn
010
110
101
1
110
100
001
11
110
110
011
11
Một mặt thực hiện phép toán trừ như vậy gây ra rất nhiều bất tiện. Mặt khác khi phép trừ cho
một kết quả âm buộc ta phải đònh nghóa một kiểu dữ liệu có thể biểu diễn được số nguyên âm.
Ta có thể biểu diễn số âm bằng cách dùng 1 bit tận cùng bên trái của thanh ghi làm bit dấu.
Theo qui ước nếu bit này bằng 0 thì đây là số dương và nếu bit này bằng 1 thì đây là số âm. Ví
dụ 0101
bin
là số +5 còn 1111
bin
là số –7. Tuy nhiên khi đó thực hiện phép trừ giữa hai số “đại số”
A và B đòi hỏi một qui tắc trừ khá phức tạp vì cùng lúc phải xét đến dấu của A, B và độ lớn
tương đối giữa A và B chưa kể đến việc phải thiết kế một mạch điện tử riêng biệt dùng để thực
hiện phép trừ. Câu hỏi đặt ra là có thể nào chỉ cần thiết kế một mạch điện tử dùng được cho cả
hai phép toán cộng và trừ. Câu trả lời là có thể.
Nhưng trước hết ta hãy quan sát ví dụ sau đây trong hệ thập phân, trong đó ta đã thay việc thực
hiện quá trình làm toán trừ bằng một quá trình “cộng” tương đương:
901
943
854
−
được thay bằng
901
9011
1
056
854
+
+
Ta thấy rằng, thay vì trừ cho 349 ta đã cộng 458 với 650 là số bù 9 của số 349, rồi lại cộng với 1
để được kết quả 1109. Kết quả này bỏ đi số 1 tận cùng bên trái sẽ được 109 là kết quả của phép
trừ. Kết quả này chắc đúng vì ta có đẳng thức:
y - x = y+(10
k
– x) – 10
k
=y+[ (10
k
–1) –x] + 1 – 10
k
.
Số hạng 10
k
– 1 luôn luôn có dạng 99...9 vì vậy phép trừ [ (10
k
–1) –x] =[99...9 – x] luôn luôn
dễ thực hiện bằng cách lấy số bù 9 của từng số hạng biểu diễn x mà không phải “mượn” gì cả!
Còn việc bỏ đi số hạng cuối cùng chẳng qua là lấy kết quả sau khi cộng với số bù 10 trừ đi cho
10
k
. Việc khử đi vò trí “dư” này trong máy tính tương đương với việc tràn số ở bit tận cùng bên
trái.
Từ nhận xét trên ta có thể nói số bù 10: (651) chính là số âm (-349) với điều kiện khi cộng với
(651) phải khử đi bit cuối cùng về bên trái.
Và cũng từ nhận xét trên ta có thể đònh nghóa số có dấu x như sau: Cho một số nguyên có biểu
diễn nhò phân x, số có dấu của x, kí hiệu (-x), chính là số bù 2 của x (ie: 2
n
– x). Để tính được số
bù 2 của x chỉ cần tính số bù 1 của x rồi cộng thêm 1.
52
Sau khi đã bỏ
số 1 tận cùng
bên trái
Ví dụ: x = 5
dec
= 0101
bin
Lấy bù 1: 1010
Cộng 1 được số bù 2: 1011
Khi đó ta có: (-x) = 1011
bin
.
Thử lại: 0101
+ 1011
1 0000
Bảng sau đây cho thấy quan hệ giữa các số bù 2 khi dùng 4 bit để biểu diễn số nguyên:
Thập phân Biểu diễn nhò phân Thập phân
Kiểu
dữ
liệu
có dấu
Kiểu dữ liệu
không dấu
0000
0 0
-1 15
1111 0001
1 1
-2 14
1110 0010
2 2
-3 13
1101 0011
3 3
-4 12
1100 0100
4 4
-5 11
1011 0101
5 5
-6 10
1010 0110
6 6
-7 9
1001 0111
7 7
1000
8 8
Đối chiếu trong bảng trên ta thấy cùng dùng 4 bit để biểu diễn số thì kiểu dữ liệu số nguyên
không dấu có phạm vi biểu diễn từ 0 đến 15 trong khi kiểu dữ liệu số nguyên có dấu có phạm vi
biểu diễn từ -7 đến +8. Cùng một biểu diễn 1100 có thể là +12 nhưng cũng có thể là (-4) tuỳ
theo kiểu dữ liệu được quan niệm. eg: 1010 + 0010 = 1100 có thể quan niệm là:
10 + 2 =12 (Kiểu số nguyên không dấu)
hoặc: -6 +2 = -4 (Kiểu số nguyên có dấu).
Mặc dù kích thước lưu trữ dữ liệu như nhau nhưng cách xử lí dữ liệu với mỗi kiểu dữ liệu là khác
nhau.
53
Số 1 này bò tràn
khỏi thanh ghi.
Cộng/Trừ số nguyên với số bù 2:
Khi biểu diễn số nguyên dưới dạng số bù 2 chúng ta có thể thực hiện các phép toán cộng
và trừ như bình thường. Ví dụ:
5
dec
– 3
dec
= 0101
bin
+ 1101
bin
= 0010
bin
= +2
dec
-5
dec
+ 3
dec
= 1011
bin
+ 0011
bin
= 1110
bin
= -2
dec
-5
dec
- 2
dec
= 1011
bin
+ 1110
bin
= 1001
bin
= -7
dec
5
dec
+ 4
dec
= 0101
bin
+ 0100
bin
= 1001
bin
= -7
dec
Dòng cuối cùng cho kết quả sai vì vượt quá phạm vi biểu diễn (từ -7 đến +8)
o Biểu diễn số thực trong máy tính:
Có thể hiện thực số thực trong máy tính bằng một trong hai cách :
Biểu diễn theo kiểu dấu chấm tónh (fixed point representation):
Giả sử ta dùng một thanh ghi 16 bit để biểu diễn số thực như sau:
16 bit
0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1
6 bit
Bit dấu Dấu chấm nhò phân giả đònh
(Biểu diễn theo kiểu dấu chấm tónh trong bộ nhớ số + 111010111.110011)
Với qui ước như trong hình trên thì số thực dương lớn nhất và nhỏ nhất có thể biểu diễn
được là:
(Maximum) 111111111.111111
bin
= (2
9
-1).(1-2
- 6
)
dec
= 511.984375
dec
(Minimum) 000000000.000001
bin
= 2
-6
= 0.015625
dec
Với cách hiện thực này ta gặp phải mấy vấn đề sau:
i) Không thể biểu diễn số thực khác 0 có giá trò tuyệt đối nhỏ hơn 0.015625
ii) Không thể biểu diễn số thực có giá trò tuyệt đối lớn hơn 511.984375
iii) Mật độ biểu diễn số thực: Giữa hai số thực bất kì x và y (x
≠
y) luôn tồn tại một số
thực khác (eg: (x+y)/2) cho dù x có gần y đến thế nào đi nữa, ie: số số thực tồn tại giữa x và y là
vô hạn. Giữa hai số thực 0 và 511.984375 là vô hạn các số thực có giá trò trung gian, nhưng theo
cách biểu diễn trên giữa số 0 và số 511.984375 chỉ có thể hiện thực đúng 2
15
= 65535 số thực
không âm khác nhau. Nói cách khác độ chính xác của số được biểu diễn bò ảnh hưởng nghiêm
trọng!
54