KIEN TRUC MAY TINH CHUONG 2

- 0 / 0
(Tài liệu chưa được thẩm định)
Nguồn:
Người gửi: Nguyễn Thanh Tùng
Ngày gửi: 16h:34' 13-10-2008
Dung lượng: 462.5 KB
Số lượt tải: 706
Nguồn:
Người gửi: Nguyễn Thanh Tùng
Ngày gửi: 16h:34' 13-10-2008
Dung lượng: 462.5 KB
Số lượt tải: 706
Số lượt thích:
0 người
Kiến trúc máy tính
Chương 2
Biểu diễn dữ liệu
& số học máy tính
Nội dung bài giảng
Chương 1: Giới thiệu chung
Chương 2: Biểu diễn DL & số học máy tính
Chương 3: Bộ xử lý
Chương 4: Kiến trúc tập lệnh
Chương 5: Hệ thống nhớ
Chương 6: Hệ thống vào/ra
Nội dung chương 2
Các hệ đếm cơ bản
Mã hoá và lưu trữ dữ liệu trong máy tính
Biểu diễn số nguyên
Các phép toán số học đối với số nguyên
Biểu diễn số thực
Biểu diễn ký tự.
Các hệ đếm cơ bản
Hệ thập phân (Decimal System)
? Con người sử dụng
Hệ nhị phân (Binary System)
? Máy tính sử dụng
Hệ thập lục phân (Hexadecimal System)
? Dùng để viết gọn số nhị phân
Bài tập
Hệ thập phân (Decimal System)
Cơ số 10
Dùng 10 chữ số: 0, 1, 2, ..., 9
Dùng n chữ số thập phân có thể biểu diễn được 10n giá trị khác nhau:
00...0 = 0
99...9 = 10n - 1
215.37 = 2*102 + 1*101 + 5*100 + 3*10-1 + 7*10-2
Các chữ số phần nguyên:
215 : 10 = 21 dư 5
21 : 10 = 2 dư 1
2 : 10 = 0 dư 2
Các chữ số phần thập phân:
0.37 * 10 = 3.7 phần nguyên = 3
0.7 * 10 = 7.0 phần nguyên = 7
Ví dụ
Hệ nhị phân (Binary System)
Cơ số 2
Dùng 2 chữ số: 0, 1
Chữ số nhị phân gọi là bit (binary digit)
Bit là đơn vị thông tin nhỏ nhất
Dùng n chữ số nhị phân có thể biểu diễn được 2n giá trị khác nhau:
00...0 = 0
11...1 = 2n - 1
Hệ nhị phân (Binary System)
Dạng tổng quát của số nhị phân:
Giả sử có một số nhị phân A:
A = an an-1 ... a1 a0 , a-1 a-2 ... a-m
Khi đó, giá trị của A được tính như sau:
A = an*2n + an-1*2n-1 + ... + a0*20 +
+ a-1*2-1 + a-2*2-2 + ... + a-m*2-m
Ví dụ
Có số nhị phân như sau: 1011 1001.101(2)
Khi đó, giá trị của chúng được tính là:
1011 1001.101(2) =
= 27 + 25 + 24 + 23 + 20 + 2-1 + 2-3
= 128 + 32 + 16 + 8 + 1 + 0.5 + 0.125
= 185.625(10)
Chuyển đổi số thập phân ? nhị phân
Chuyển đổi phần nguyên:
Cách 1: Chia liên tiếp cho 2 rồi lấy phần dư
Cách 2: Phân tích thành tổng các luỹ thừa của 2
Chuyển đổi phần thập phân:
Nhân phần thập phân với 2, lấy phần nguyên
Ví dụ chuyển đổi
Có số ở hệ thập phân như sau: 61.3125
Chuyển đổi phần nguyên: 61(10) = 111101(2)
Chuyển đổi phần thập phân:
0.3125 * 2 = 0.625 phần nguyên = 0
0.625 * 2 = 1.25 phần nguyên = 1
0.25 * 2 = 0.5 phần nguyên = 0
0.5 * 2 = 1.0 phần nguyên = 1
Vậy: 61.3125(10) = 111101.0101(2)
Cơ số 16
Dùng 16 chữ số: 0,1,..., 9, A, B, ..., F
Dùng để viết gọn cho số nhị phân: cứ một nhóm 4 bit sẽ được thay bằng một chữ số Hexa
Dùng n chữ số Hexa có thể biểu diễn được 16n giá trị khác nhau:
00...0 = 0
FF...F = 16n - 1
Hệ thập lục phân (Hexadecimal System)
Mã hoá & lưu trữ dữ liệu trong máy tính
Mã hoá dữ liệu
Lưu trữ dữ liệu
Mã hoá dữ liệu
Nguyên tắc chung
Mọi dữ liệu đưa vào máy tính đều phải được mã hoá thành số nhị phân
Các loại dữ liệu:
Dữ liệu nhân tạo: do con người quy ước
Dữ liệu tự nhiên: tồn tại khách quan với con người
Mã hoá dữ liệu nhân tạo:
Dữ liệu dạng số: mã hoá theo chuẩn quy ước
Dữ liệu ký tự: mã hoá theo bộ mã ký tự
Mã hoá dữ liệu
Mã hoá và tái tạo tín hiệu tự nhiên
Lưu trữ dữ liệu
Bộ nhớ chính được tổ chức theo byte
Độ dài dữ liệu có thể chiếm 1 hay nhiều byte
Có 2 cách lưu trữ các byte trong bộ nhớ chính:
Little-endian (đầu nhỏ): byte có ý nghĩa thấp hơn được lưu trữ ở vị trí có địa chỉ nhỏ hơn
Big-endian (đầu to): byte có ý nghĩa thấp hơn được lưu trữ ở vị trí có địa chỉ lớn hơn
Ví dụ lưu trữ dữ liệu 32 bit
Ví dụ: Intel 80x86, Px: đầu nhỏ
Motorola 680x0: đầu to
Power PC, Itanium: cả hai loại
Biểu diễn số nguyên
Số nguyên không dấu (unsigned integer)
Số nguyên có dấu (signed integer)
Chuyển đổi độ dài
Bài tập
Số nguyên không dấu
Nguyên tắc chung
Dùng n chữ số nhị phân thì biểu diễn được 2n số
Dải biểu diễn: 0 ? 2n - 1
Ví dụ:
n = 8 bit: dải biểu diễn: 0 ? 28 -1, hay 0 ? 255
n = 16 bit: dải biểu diễn: 0 ? 216 - 1, hay 0 ? 65535
Cách biểu diễn
Biểu diễn ở dạng nhị phân một cách bình thường
Các ví dụ
Ví dụ 1: biểu diễn các số nguyên không dấu sau đây dùng 8 bit:
A = 73 ; B = 138
Giải:
A = 73 = 64 + 8 + 1 = 26 + 23 + 20
73 = 0100 1001
B = 138 = 128 + 8 + 2 = 27 + 23 + 21
138 = 1000 1010
Các ví dụ
Ví dụ 2: Hãy xác định giá trị của các số nguyên không dấu C, D được biểu diễn bằng 8 bit như sau:
C = 0010 1010; D = 1010 0110
Giải:
C = 0010 1010 = 25 + 23 + 21 = 32 + 8 + 2 = 42
D = 1010 0110 = 27 + 25 + 22 + 21 =
= 128 + 32 + 4 + 2 = 166
Số nguyên có dấu
Nguyên tắc chung
Dùng n chữ số nhị phân thì biểu diễn được 2n số
Dải biểu diễn: - 2n-1 ? 2n-1 - 1
Ví dụ:
n = 8 bit: dải biểu diễn: - 27 ? 27 -1, hay -128 ? 127
n = 16 bit: - 215 ? 215 - 1, hay - 32768 ? 32767
Cách biểu diễn:
PP1: Dùng dấu và độ lớn (Sign-Magnitude)
PP2: Dùng mã bù 2 (Two`s complement)
Dùng dấu và độ lớn
Bit lớn nhất biểu diễn dấu:
0: biểu diễn số dương
1: biểu diễn số âm
Các bit còn lại biểu diễn giá trị
Ví dụ:
+23 = 0001 0111; -23 = 1001 0111
Vấn đề nảy sinh
Cần quan tâm cả phần dấu và phần độ lớn khi thực hiện các phép toán số học
Có đến 2 cách biểu diễn cho số 0 (+0 và -0)
Dùng mã bù 2
Đối với số dương: biểu diễn dạng nhị phân
Đối với số âm: tìm số bù 2:
B1: đổi số dương tương ứng ? nhị phân
B2: tìm số bù 1 (đảo bit 1 ? 0, 0 ? 1)
B3: tìm số bù 2: số bù 1 cộng với 1
Số bù 2 thu được chính là cách biểu diễn số âm
Đặc điểm:
Thực hiện các phép toán số học dễ dàng
Chỉ có một sự biểu diễn duy nhất cho số 0
Các ví dụ
Ví dụ 1: Biểu diễn các số nguyên có dấu sau đây bằng 8 bit: A = + 69; B = - 92
Giải:
A = + 69 = 0100 0101
B = - 92 Ta có: + 92 = 0101 1100
Số bù 1 = 1010 0011
1
Số bù 2 = 1010 0100
Vậy: B = -92 = 1010 0100
+
Các ví dụ
Ví dụ 2: Xác định giá trị của các số nguyên có dấu biểu diễn dưới đây (dùng dấu - độ lớn):
C = 0110 1010; D = 1100 0011
Giải:
C = 0110 1010 = + (64 + 32 + 8 + 2) = 106
D = 1100 0011 = - (64 + 2 + 1) = - 67
Các ví dụ
Ví dụ 3: Xác định giá trị của các số nguyên có dấu được biểu diễn dưới đây (dùng mã bù 2):
E = 0101 1110; F = 1101 1010
Giải:
E = 0101 1110 = 64 + 16 + 8 + 4 + 2 = 94
F = 1101 1010 = -128 + 64 + 16 + 8 + 2 = -38
Chuyển đổi độ dài
Đối với số dương: thêm/bớt số 0 ở phía trước:
+23 = 0001 0111 (8 bit)
+23 = 0000 0000 0001 0111 (16 bit)
Đối với số âm: thêm/bớt số 1 ở phía trước:
-23 = 1110 1001 (8 bit)
-23 = 1111 1111 1110 1001 (16 bit)
Các phép toán số học
Phép cộng
Phép trừ
Phép nhân
Phép chia
Bài tập
Phép cộng (addition)
Cộng số nguyên không dấu
Cộng số nguyên có dấu
Nguyên tắc
Nguyên tắc
Khi cộng hai số nguyên không dấu n bit:
Nếu không có nhớ ra khỏi bit cao nhất thì tổng luôn đúng (Cout = 0)
Nếu có nhớ ra ngoài (Carry out) thì tổng là sai (Cout = 1), ta nói rằng phép cộng đã tràn nhớ
Tràn nhớ ra ngoài xảy ra khi tổng > 2n - 1
Ví dụ
Ví dụ 1:
71 = 0100 0111
25 = 0001 1001
96 0110 0000 = 64 + 32 = 96 ? đúng
Ví dụ 2:
251 = 1111 1011
16 = 0001 0000
267 1 0000 1011 = 8 + 2 + 1 = 11 ? sai
+
+
+
+
Nguyên tắc
Khi cộng hai số nguyên có dấu n bit, không quan tâm đến bit nhớ ra ngoài (Cout), kết quả nhận được là n bit:
Nếu cộng hai số khác dấu, tổng thu được luôn luôn đúng
Cộng hai số cùng dấu, nếu tổng cùng dấu với các số hạng thì tổng đó đúng
Cộng hai số cùng dấu, nếu tổng ngược dấu với các số hạng thì tổng đó sai, ta nói tổng bị tràn (Overflow)
Ví dụ
Ví dụ 1 (cộng hai số khác dấu ? tổng đúng):
-71 = 1011 1001 (+71 = 0100 0111)
+25 = 0001 1001
-46 1101 0010 = -46 ? đúng
Ví dụ 2 (cộng hai số âm ? tổng đúng):
-51 = 1100 1101 (+51= 0011 0011)
-16 = 1111 0000 (+16 = 0001 0000)
-67 1 1011 1101 = -67 ? đúng
+
+
+
+
Ví dụ
Ví dụ 3 (cộng hai số dương ? tổng đúng):
+71 = 0100 0111
+25 = 0001 1001
+96 0110 0000 = +96 ? đúng
Ví dụ 4 (cộng hai số âm ? tổng sai):
-97 = 1001 1111 (+97= 0110 0001)
-89 = 1010 0111 (+89 = 0101 1001)
-186 1 0100 0110 = +72 ? sai
+
+
+
+
Ví dụ
Ví dụ 5 (cộng hai số dương ? tổng sai):
+87 = 0101 0111
+84 = 0101 0100
+171 1010 1011 = -85 ? sai
+
+
Phép trừ (subtraction)
Ta có: A - B = A + (-B)
Phép nhân (Multiplication)
Nhân số nguyên không dấu
Nhân số nguyên có dấu
Ví dụ
1100 Số bị nhân (12)
1011 Số nhân (11)
1100
1100
0000
1100
10000100 Tích (132)
+
Các tích thành phần
Nguyên tắc thực hiện phép nhân
Các tích thành phần được tính như sau:
Nếu bit tương ứng của số nhân bằng 0 ? tích thành phần bằng 0
Nếu bit tương ứng của số nhân bằng 1 ? tích thành phần bằng số bị nhân
Tích thành phần tiếp theo được dịch trái 1 bit so với tích trước đó
Tổng các tích thành phần là Tích cuối cùng
Nhân hai số n bit, tích có độ dài 2n bit
Sơ đồ mạch nhân
Sơ đồ khối thực hiện phép nhân
Diễn giải ví dụ (12 x 11 = 132)
Lần thứ nhất
Lần thứ hai
Lần thứ ba
Lần thứ tư
Tích chứa trong A,Q
Nhân số nguyên có dấu
Không thực hiện trực tiếp được trong máy tính
Giải pháp 1:
Chuyển đổi thành số dương nếu cần
Thực hiện nhân như đối với số không dấu
Nếu hai số khác dấu ? tích là số âm
Giải pháp 2:
Dùng thuật toán Booth (nhanh hơn)
Thuật toán Booth
Ví dụ 1: (-7) x 3 = -21
Lần thứ nhất
Lần thứ hai
Lần thứ ba
Lần thứ tư
Tích chứa trong A,Q
Ví dụ 2: (-5) x (-6) = +30
Lần thứ nhất
Lần thứ hai
Lần thứ ba
Lần thứ tư
Tích chứa trong A,Q
Ví dụ:
138 : 12 = 11, dư 6
Số bị chia 10001010 1100 Số chia
1100 1011 Thương
010101
1100
10010
1100
0110 Số dư
A chứa số dư
Q chứa thương số (M, (A,Q) cùng dấu)
Q chứa bù 2 của thương số
(M, (A,Q) khác dấu)
Thuật toán thực hiện phép chia
Ví dụ 1: 12 : 4 = 3, dư 0
Ví dụ 2: 13 : (-4) = -3, dư 1
Ví dụ 3: (-11) : 3 = (-3), dư (-2)
Ví dụ 4: (-14) : (-6) = 2, dư (-2)
Biểu diễn số thực
Nguyên tắc chung
Chuẩn IEEE 754/85
Bài tập
Nguyên tắc chung
Một số thực X có thể biểu diễn như sau:
X = (-1)S * M * RE
Trong đó:
S (sign): dấu (0: số dương; 1: số âm)
M (mantissa): phần định trị
R (radix): cơ số
E (exponent): số mũ
Ví dụ
X = -1234.567 = (-1)1 * 1234567 * 10-3
S = 1; M = 1234567
R = 10; E = -3
X = 0.13579 = (-1)0 * 13579 * 10-5
S = 0; M = 13579;
R = 10; E = -5
Các phép toán số học
X1 = (-1)S1 * M1 * RE1
X2 = (-1)S2 * M2 * RE2
Phép nhân:
X1 * X2 = (-1)S1?S2 * (M1*M2) * RE1 + E2
Phép chia:
X1 / X2 = (-1)S1?S2 * (M1/M2) * RE1 - E2
Phép cộng / trừ:
X1 ? X2 = RE1*[(-1)S1*M1 ? (-1)S2 * M2*RE2 - E1]
Chuẩn IEEE 754/85
Có 3 dạng:
Dạng đơn (single precision): 32 bit
Dạng kép (double precision): 64 bit
Dạng kép mở rộng (double-extended precision): 80 bit
Cả 3 dạng đều có điểm chung: R = 2
Dạng đơn: 32 bit
Khi đó, 1 số thực bất kỳ được biểu diễn:
X = (-1)S * 1,M * 2E - 127
Dải giá trị biểu diễn:
2-127 < ?X ?< 2127,
hay: 10-38 < ?X ?< 1038
M (phần định trị)
E (phần mũ)
S (dấu)
31 30 23 22 0
23 bit
8 bit
1 bit
Chuyển đổi ? IEEE 754/85 (32 bit)
Bước 1: Đổi số thực đó ? nhị phân
Bước 2: Chuyển về dạng: ?1,aa...a * 2b
Bước 3: Xác định các giá trị:
S = 0 nếu số dương; S = 1 nếu số âm
E - 127 = b ? E = 127 + b ? nhị phân
M = aa...a00...0
23 bit
Ví dụ chuyển đổi
Ví dụ 1: 17,625 ? IEEE 754/85
B1: A = 17,625 = 10001,101
B2: A = 1,0001101 * 24 (?1,aa...a * 2b)
B3: Ta có:
S = 0, vì A > 0
E - 127 = 4 ? E = 131 = 1000 0011
M = 000 1101 0000 0000 0000 0000
? A = 0100 0001 1000 1101 0000 0000 0000 0000
= 41 8D 00 00H
Ví dụ chuyển đổi
Ví dụ 2: -112,3125 ? IEEE 754/85
B1: B = -112,3125 = -1110000,0101
B2: B = -1,1100000101 * 26 (?1,aa...a * 2b)
B3: Ta có:
S = 1, vì B < 0
E - 127 = 6 ? E = 133 = 1000 0101
M = 110 0000 1010 0000 0000 0000
? A = 1100 0010 1110 0000 1010 0000 0000 0000
= C2 E0 A0 00H
Ví dụ chuyển đổi
Ví dụ 3: -19 / 64 ? IEEE 754/85
B1: C = -19 / 64 = -19 * (1 / 64)
B2: C = -10011 * 2-6 = -1,0011 * 2-2
B3: Ta có:
S = 1, vì C < 0
E - 127 = -2 ? E = 125 = 0111 1100
M = 001 1000 0000 0000 0000 0000
? A = 1011 1110 0001 1000 0000 0000 0000 0000
= BE 18 00 00H
Ví dụ chuyển đổi
Ví dụ 4: Tìm giá trị số thực: C2 0D 00 00H
Giải:
Ta có: X = C2 0D 00 00H =
= 1100 0010 0000 1101 0000 0000 0000 0000
S = 1 ? X < 0
E = 1000 0100 = 132 ? E -127 = 5
M = 000 1101 0000 0000 0000 0000
? X = -1,0001101 * 25 = -100011,01 = -35,25
Dạng kép: 64 bit
Khi đó, 1 số thực bất kỳ được biểu diễn:
X = (-1)S * 1,M * 2E - 1023
Dải giá trị biểu diễn:
2-1023 < ?X ?< 21023,
hay: 10-308 < ?X ?< 10308
Dạng kép mở rộng: 80 bit
Khi đó, 1 số thực bất kỳ được biểu diễn:
X = (-1)S * 1,M * 2E - 16383
Dải giá trị biểu diễn:
2-16383 < ?X ?< 216383,
hay: 10-4932 < ?X ?< 104932
Các quy ước đặc biệt
E = 0, M = 0 ? X = 0
x000 0000 0000 0000 0000 0000 0000 0000 = ?0
E = 11...1, M = 0 ? X = ??
x111 1111 1000 0000 0000 0000 0000 0000 = ??
E = 11...1, M ? 0 ? X: NaN (không phải số)
Biểu diễn ký tự
Bộ mã ASCII (American Standard Code for Information Interchange)
Bộ mã Unicode
Bộ mã ASCII
Do ANSI (American National Standard Institute) thiết kế
Là bộ mã 8 bit, có thể mã hóa được 28 ký tự, có mã từ 0016 ? FF16 , gồm:
128 ký tự chuẩn, có mã 0016 ? 7F16, gồm:
Các ký tự điều khiển: màn hình, máy tin, truyền tin.
Các ký tự soạn thảo văn bản
128 ký tự mở rộng, có mã 8016 ? FF16, gồm:
Các ký tự đặc biệt, kẻ khung, tiếng Pháp, ...
Bộ mã Unicode
Là bộ mã hợp nhất, do các hãng máy tính hàng đầu thiết kế
Là bộ mã 16 bit
Là bộ mã đa ngôn ngữ
Có hỗ trợ các ký tự tiếng Việt
Kiến trúc máy tính
Hết chương 2
Bài tập (các hệ đếm)
Bài 1: Đổi các số sau từ hệ thập phân ? hệ nhị phân:
a) 28; b) 89; c) 294
d) 34,5; e) 55,25; f) 46,3125
Bài 2: Đổi các số sau từ hệ nhị phân ? hệ thập phân:
a) 11001; b) 111001
c) 10111011; d) 10001001
Bài tập (các hệ đếm)
Bài 3: Đổi các số sau từ hệ thập phân ? hệ thập lục:
a) 68; b) 29; c) 215
Bài 4: Đổi các số sau từ hệ thập lục ? hệ thập phân:
a) AF; b) 123; c) 10D
Bài tập (biểu diễn số nguyên)
Bài 1: Biểu diễn các số sau dùng dấu và độ lớn (8 bit):
a) +69; b) +105; c) -28; d) -121
Bài 2: Biểu diễn các số sau dùng dấu và độ lớn (16 bit):
a) +109; b) +105; c) -98; d) -131
Bài 3: Biểu diễn các số sau dùng mã bù 2 (8 bit - không dấu):
a) 57; b) 48; c) 98; d) 131
Bài tập (biểu diễn số nguyên)
Bài 4: Biểu diễn các số sau dùng mã bù 2 (8 bit - có dấu):
a) +57; b) +48; c) -98; d) -31
Bài 5: Biểu diễn các số sau dùng mã bù 2 (16 bit - không dấu):
a) 157; b) 108; c) 128; d) 35
Bài 6: Biểu diễn các số sau dùng mã bù 2 (16 bit - có dấu):
a) 137; b) 119; c) -113; d) -53
Bài tập (biểu diễn số nguyên)
Bài 7: Có các biểu diễn sau (dùng dấu và độ lớn), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1001 1100
c) 0000 0000 1001 0010; d) 1000 0000 0110 1100
Bài 8: Có các biểu diễn sau (dùng mã bù 2 - không dấu), hãy xác định giá trị:
a) 0100 001 b) 1010 0100
c) 0000 0000 1001 0010; d) 1000 0000 0010 0100
Bài tập (biểu diễn số nguyên)
Bài 9: Có các biểu diễn sau (dùng mã bù 2 - có dấu), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1101 1100
c) 0000 0000 0101 0011; d) 1111 1111 1110 1110
Bài tập (các phép toán với số nguyên)
Bài 1: Cho biết kết quả khi thực hiện trên máy tính các phép cộng sau (8 bit) và giải thích:
a) 56 + 78 (không dấu); b) 121 + 40 (không dấu)
c) 68 + 40 (có dấu) ; d) 67 + (-100) (có dấu)
e) 102 + 88 (có dấu); f) (-80) + (-62) (có dấu)
Bài 2: Mô tả quá trình nhân trên máy tính các số 4 bit sau đây:
a) 13 * 7; b) 6 * 14; c) 15 * 14
d) (-5) * 3; e) 6 * (-2); f) (-7) * (-4)
Bài tập (các phép toán với số nguyên)
Bài 3: Mô tả quá trình chia trên máy tính các số sau đây:
a) 13 : 5; b) 10 : (-4)
c) (-11) : 6; d) (-14) : (-5)
Bài tập (biểu diễn số thực)
Bài 1: Biểu diễn các số sau theo chuẩn IEEE 754/85 32 bit:
a) 78,25; b) -23,625; c) 50,3125
d) -133/128 e) 20,15
Bài 2: Có các biểu diễn theo chuẩn IEEE 754/85 sau, xác định giá trị của chúng:
a) 41 8D 00 00H; b) C2 96 20 00H
c) 3E A0 00 00H; d) BC 91 00 00H
Bài tập (biểu diễn số thực)
Bài 3: Có các biểu diễn theo chuẩn IEEE 754/85 sau, xác định giá trị của chúng:
a) 10 00 00 00H; b) 7F 80 00 00H
c) FF 80 00 00H; d) 7F 80 00 10H
Chương 2
Biểu diễn dữ liệu
& số học máy tính
Nội dung bài giảng
Chương 1: Giới thiệu chung
Chương 2: Biểu diễn DL & số học máy tính
Chương 3: Bộ xử lý
Chương 4: Kiến trúc tập lệnh
Chương 5: Hệ thống nhớ
Chương 6: Hệ thống vào/ra
Nội dung chương 2
Các hệ đếm cơ bản
Mã hoá và lưu trữ dữ liệu trong máy tính
Biểu diễn số nguyên
Các phép toán số học đối với số nguyên
Biểu diễn số thực
Biểu diễn ký tự.
Các hệ đếm cơ bản
Hệ thập phân (Decimal System)
? Con người sử dụng
Hệ nhị phân (Binary System)
? Máy tính sử dụng
Hệ thập lục phân (Hexadecimal System)
? Dùng để viết gọn số nhị phân
Bài tập
Hệ thập phân (Decimal System)
Cơ số 10
Dùng 10 chữ số: 0, 1, 2, ..., 9
Dùng n chữ số thập phân có thể biểu diễn được 10n giá trị khác nhau:
00...0 = 0
99...9 = 10n - 1
215.37 = 2*102 + 1*101 + 5*100 + 3*10-1 + 7*10-2
Các chữ số phần nguyên:
215 : 10 = 21 dư 5
21 : 10 = 2 dư 1
2 : 10 = 0 dư 2
Các chữ số phần thập phân:
0.37 * 10 = 3.7 phần nguyên = 3
0.7 * 10 = 7.0 phần nguyên = 7
Ví dụ
Hệ nhị phân (Binary System)
Cơ số 2
Dùng 2 chữ số: 0, 1
Chữ số nhị phân gọi là bit (binary digit)
Bit là đơn vị thông tin nhỏ nhất
Dùng n chữ số nhị phân có thể biểu diễn được 2n giá trị khác nhau:
00...0 = 0
11...1 = 2n - 1
Hệ nhị phân (Binary System)
Dạng tổng quát của số nhị phân:
Giả sử có một số nhị phân A:
A = an an-1 ... a1 a0 , a-1 a-2 ... a-m
Khi đó, giá trị của A được tính như sau:
A = an*2n + an-1*2n-1 + ... + a0*20 +
+ a-1*2-1 + a-2*2-2 + ... + a-m*2-m
Ví dụ
Có số nhị phân như sau: 1011 1001.101(2)
Khi đó, giá trị của chúng được tính là:
1011 1001.101(2) =
= 27 + 25 + 24 + 23 + 20 + 2-1 + 2-3
= 128 + 32 + 16 + 8 + 1 + 0.5 + 0.125
= 185.625(10)
Chuyển đổi số thập phân ? nhị phân
Chuyển đổi phần nguyên:
Cách 1: Chia liên tiếp cho 2 rồi lấy phần dư
Cách 2: Phân tích thành tổng các luỹ thừa của 2
Chuyển đổi phần thập phân:
Nhân phần thập phân với 2, lấy phần nguyên
Ví dụ chuyển đổi
Có số ở hệ thập phân như sau: 61.3125
Chuyển đổi phần nguyên: 61(10) = 111101(2)
Chuyển đổi phần thập phân:
0.3125 * 2 = 0.625 phần nguyên = 0
0.625 * 2 = 1.25 phần nguyên = 1
0.25 * 2 = 0.5 phần nguyên = 0
0.5 * 2 = 1.0 phần nguyên = 1
Vậy: 61.3125(10) = 111101.0101(2)
Cơ số 16
Dùng 16 chữ số: 0,1,..., 9, A, B, ..., F
Dùng để viết gọn cho số nhị phân: cứ một nhóm 4 bit sẽ được thay bằng một chữ số Hexa
Dùng n chữ số Hexa có thể biểu diễn được 16n giá trị khác nhau:
00...0 = 0
FF...F = 16n - 1
Hệ thập lục phân (Hexadecimal System)
Mã hoá & lưu trữ dữ liệu trong máy tính
Mã hoá dữ liệu
Lưu trữ dữ liệu
Mã hoá dữ liệu
Nguyên tắc chung
Mọi dữ liệu đưa vào máy tính đều phải được mã hoá thành số nhị phân
Các loại dữ liệu:
Dữ liệu nhân tạo: do con người quy ước
Dữ liệu tự nhiên: tồn tại khách quan với con người
Mã hoá dữ liệu nhân tạo:
Dữ liệu dạng số: mã hoá theo chuẩn quy ước
Dữ liệu ký tự: mã hoá theo bộ mã ký tự
Mã hoá dữ liệu
Mã hoá và tái tạo tín hiệu tự nhiên
Lưu trữ dữ liệu
Bộ nhớ chính được tổ chức theo byte
Độ dài dữ liệu có thể chiếm 1 hay nhiều byte
Có 2 cách lưu trữ các byte trong bộ nhớ chính:
Little-endian (đầu nhỏ): byte có ý nghĩa thấp hơn được lưu trữ ở vị trí có địa chỉ nhỏ hơn
Big-endian (đầu to): byte có ý nghĩa thấp hơn được lưu trữ ở vị trí có địa chỉ lớn hơn
Ví dụ lưu trữ dữ liệu 32 bit
Ví dụ: Intel 80x86, Px: đầu nhỏ
Motorola 680x0: đầu to
Power PC, Itanium: cả hai loại
Biểu diễn số nguyên
Số nguyên không dấu (unsigned integer)
Số nguyên có dấu (signed integer)
Chuyển đổi độ dài
Bài tập
Số nguyên không dấu
Nguyên tắc chung
Dùng n chữ số nhị phân thì biểu diễn được 2n số
Dải biểu diễn: 0 ? 2n - 1
Ví dụ:
n = 8 bit: dải biểu diễn: 0 ? 28 -1, hay 0 ? 255
n = 16 bit: dải biểu diễn: 0 ? 216 - 1, hay 0 ? 65535
Cách biểu diễn
Biểu diễn ở dạng nhị phân một cách bình thường
Các ví dụ
Ví dụ 1: biểu diễn các số nguyên không dấu sau đây dùng 8 bit:
A = 73 ; B = 138
Giải:
A = 73 = 64 + 8 + 1 = 26 + 23 + 20
73 = 0100 1001
B = 138 = 128 + 8 + 2 = 27 + 23 + 21
138 = 1000 1010
Các ví dụ
Ví dụ 2: Hãy xác định giá trị của các số nguyên không dấu C, D được biểu diễn bằng 8 bit như sau:
C = 0010 1010; D = 1010 0110
Giải:
C = 0010 1010 = 25 + 23 + 21 = 32 + 8 + 2 = 42
D = 1010 0110 = 27 + 25 + 22 + 21 =
= 128 + 32 + 4 + 2 = 166
Số nguyên có dấu
Nguyên tắc chung
Dùng n chữ số nhị phân thì biểu diễn được 2n số
Dải biểu diễn: - 2n-1 ? 2n-1 - 1
Ví dụ:
n = 8 bit: dải biểu diễn: - 27 ? 27 -1, hay -128 ? 127
n = 16 bit: - 215 ? 215 - 1, hay - 32768 ? 32767
Cách biểu diễn:
PP1: Dùng dấu và độ lớn (Sign-Magnitude)
PP2: Dùng mã bù 2 (Two`s complement)
Dùng dấu và độ lớn
Bit lớn nhất biểu diễn dấu:
0: biểu diễn số dương
1: biểu diễn số âm
Các bit còn lại biểu diễn giá trị
Ví dụ:
+23 = 0001 0111; -23 = 1001 0111
Vấn đề nảy sinh
Cần quan tâm cả phần dấu và phần độ lớn khi thực hiện các phép toán số học
Có đến 2 cách biểu diễn cho số 0 (+0 và -0)
Dùng mã bù 2
Đối với số dương: biểu diễn dạng nhị phân
Đối với số âm: tìm số bù 2:
B1: đổi số dương tương ứng ? nhị phân
B2: tìm số bù 1 (đảo bit 1 ? 0, 0 ? 1)
B3: tìm số bù 2: số bù 1 cộng với 1
Số bù 2 thu được chính là cách biểu diễn số âm
Đặc điểm:
Thực hiện các phép toán số học dễ dàng
Chỉ có một sự biểu diễn duy nhất cho số 0
Các ví dụ
Ví dụ 1: Biểu diễn các số nguyên có dấu sau đây bằng 8 bit: A = + 69; B = - 92
Giải:
A = + 69 = 0100 0101
B = - 92 Ta có: + 92 = 0101 1100
Số bù 1 = 1010 0011
1
Số bù 2 = 1010 0100
Vậy: B = -92 = 1010 0100
+
Các ví dụ
Ví dụ 2: Xác định giá trị của các số nguyên có dấu biểu diễn dưới đây (dùng dấu - độ lớn):
C = 0110 1010; D = 1100 0011
Giải:
C = 0110 1010 = + (64 + 32 + 8 + 2) = 106
D = 1100 0011 = - (64 + 2 + 1) = - 67
Các ví dụ
Ví dụ 3: Xác định giá trị của các số nguyên có dấu được biểu diễn dưới đây (dùng mã bù 2):
E = 0101 1110; F = 1101 1010
Giải:
E = 0101 1110 = 64 + 16 + 8 + 4 + 2 = 94
F = 1101 1010 = -128 + 64 + 16 + 8 + 2 = -38
Chuyển đổi độ dài
Đối với số dương: thêm/bớt số 0 ở phía trước:
+23 = 0001 0111 (8 bit)
+23 = 0000 0000 0001 0111 (16 bit)
Đối với số âm: thêm/bớt số 1 ở phía trước:
-23 = 1110 1001 (8 bit)
-23 = 1111 1111 1110 1001 (16 bit)
Các phép toán số học
Phép cộng
Phép trừ
Phép nhân
Phép chia
Bài tập
Phép cộng (addition)
Cộng số nguyên không dấu
Cộng số nguyên có dấu
Nguyên tắc
Nguyên tắc
Khi cộng hai số nguyên không dấu n bit:
Nếu không có nhớ ra khỏi bit cao nhất thì tổng luôn đúng (Cout = 0)
Nếu có nhớ ra ngoài (Carry out) thì tổng là sai (Cout = 1), ta nói rằng phép cộng đã tràn nhớ
Tràn nhớ ra ngoài xảy ra khi tổng > 2n - 1
Ví dụ
Ví dụ 1:
71 = 0100 0111
25 = 0001 1001
96 0110 0000 = 64 + 32 = 96 ? đúng
Ví dụ 2:
251 = 1111 1011
16 = 0001 0000
267 1 0000 1011 = 8 + 2 + 1 = 11 ? sai
+
+
+
+
Nguyên tắc
Khi cộng hai số nguyên có dấu n bit, không quan tâm đến bit nhớ ra ngoài (Cout), kết quả nhận được là n bit:
Nếu cộng hai số khác dấu, tổng thu được luôn luôn đúng
Cộng hai số cùng dấu, nếu tổng cùng dấu với các số hạng thì tổng đó đúng
Cộng hai số cùng dấu, nếu tổng ngược dấu với các số hạng thì tổng đó sai, ta nói tổng bị tràn (Overflow)
Ví dụ
Ví dụ 1 (cộng hai số khác dấu ? tổng đúng):
-71 = 1011 1001 (+71 = 0100 0111)
+25 = 0001 1001
-46 1101 0010 = -46 ? đúng
Ví dụ 2 (cộng hai số âm ? tổng đúng):
-51 = 1100 1101 (+51= 0011 0011)
-16 = 1111 0000 (+16 = 0001 0000)
-67 1 1011 1101 = -67 ? đúng
+
+
+
+
Ví dụ
Ví dụ 3 (cộng hai số dương ? tổng đúng):
+71 = 0100 0111
+25 = 0001 1001
+96 0110 0000 = +96 ? đúng
Ví dụ 4 (cộng hai số âm ? tổng sai):
-97 = 1001 1111 (+97= 0110 0001)
-89 = 1010 0111 (+89 = 0101 1001)
-186 1 0100 0110 = +72 ? sai
+
+
+
+
Ví dụ
Ví dụ 5 (cộng hai số dương ? tổng sai):
+87 = 0101 0111
+84 = 0101 0100
+171 1010 1011 = -85 ? sai
+
+
Phép trừ (subtraction)
Ta có: A - B = A + (-B)
Phép nhân (Multiplication)
Nhân số nguyên không dấu
Nhân số nguyên có dấu
Ví dụ
1100 Số bị nhân (12)
1011 Số nhân (11)
1100
1100
0000
1100
10000100 Tích (132)
+
Các tích thành phần
Nguyên tắc thực hiện phép nhân
Các tích thành phần được tính như sau:
Nếu bit tương ứng của số nhân bằng 0 ? tích thành phần bằng 0
Nếu bit tương ứng của số nhân bằng 1 ? tích thành phần bằng số bị nhân
Tích thành phần tiếp theo được dịch trái 1 bit so với tích trước đó
Tổng các tích thành phần là Tích cuối cùng
Nhân hai số n bit, tích có độ dài 2n bit
Sơ đồ mạch nhân
Sơ đồ khối thực hiện phép nhân
Diễn giải ví dụ (12 x 11 = 132)
Lần thứ nhất
Lần thứ hai
Lần thứ ba
Lần thứ tư
Tích chứa trong A,Q
Nhân số nguyên có dấu
Không thực hiện trực tiếp được trong máy tính
Giải pháp 1:
Chuyển đổi thành số dương nếu cần
Thực hiện nhân như đối với số không dấu
Nếu hai số khác dấu ? tích là số âm
Giải pháp 2:
Dùng thuật toán Booth (nhanh hơn)
Thuật toán Booth
Ví dụ 1: (-7) x 3 = -21
Lần thứ nhất
Lần thứ hai
Lần thứ ba
Lần thứ tư
Tích chứa trong A,Q
Ví dụ 2: (-5) x (-6) = +30
Lần thứ nhất
Lần thứ hai
Lần thứ ba
Lần thứ tư
Tích chứa trong A,Q
Ví dụ:
138 : 12 = 11, dư 6
Số bị chia 10001010 1100 Số chia
1100 1011 Thương
010101
1100
10010
1100
0110 Số dư
A chứa số dư
Q chứa thương số (M, (A,Q) cùng dấu)
Q chứa bù 2 của thương số
(M, (A,Q) khác dấu)
Thuật toán thực hiện phép chia
Ví dụ 1: 12 : 4 = 3, dư 0
Ví dụ 2: 13 : (-4) = -3, dư 1
Ví dụ 3: (-11) : 3 = (-3), dư (-2)
Ví dụ 4: (-14) : (-6) = 2, dư (-2)
Biểu diễn số thực
Nguyên tắc chung
Chuẩn IEEE 754/85
Bài tập
Nguyên tắc chung
Một số thực X có thể biểu diễn như sau:
X = (-1)S * M * RE
Trong đó:
S (sign): dấu (0: số dương; 1: số âm)
M (mantissa): phần định trị
R (radix): cơ số
E (exponent): số mũ
Ví dụ
X = -1234.567 = (-1)1 * 1234567 * 10-3
S = 1; M = 1234567
R = 10; E = -3
X = 0.13579 = (-1)0 * 13579 * 10-5
S = 0; M = 13579;
R = 10; E = -5
Các phép toán số học
X1 = (-1)S1 * M1 * RE1
X2 = (-1)S2 * M2 * RE2
Phép nhân:
X1 * X2 = (-1)S1?S2 * (M1*M2) * RE1 + E2
Phép chia:
X1 / X2 = (-1)S1?S2 * (M1/M2) * RE1 - E2
Phép cộng / trừ:
X1 ? X2 = RE1*[(-1)S1*M1 ? (-1)S2 * M2*RE2 - E1]
Chuẩn IEEE 754/85
Có 3 dạng:
Dạng đơn (single precision): 32 bit
Dạng kép (double precision): 64 bit
Dạng kép mở rộng (double-extended precision): 80 bit
Cả 3 dạng đều có điểm chung: R = 2
Dạng đơn: 32 bit
Khi đó, 1 số thực bất kỳ được biểu diễn:
X = (-1)S * 1,M * 2E - 127
Dải giá trị biểu diễn:
2-127 < ?X ?< 2127,
hay: 10-38 < ?X ?< 1038
M (phần định trị)
E (phần mũ)
S (dấu)
31 30 23 22 0
23 bit
8 bit
1 bit
Chuyển đổi ? IEEE 754/85 (32 bit)
Bước 1: Đổi số thực đó ? nhị phân
Bước 2: Chuyển về dạng: ?1,aa...a * 2b
Bước 3: Xác định các giá trị:
S = 0 nếu số dương; S = 1 nếu số âm
E - 127 = b ? E = 127 + b ? nhị phân
M = aa...a00...0
23 bit
Ví dụ chuyển đổi
Ví dụ 1: 17,625 ? IEEE 754/85
B1: A = 17,625 = 10001,101
B2: A = 1,0001101 * 24 (?1,aa...a * 2b)
B3: Ta có:
S = 0, vì A > 0
E - 127 = 4 ? E = 131 = 1000 0011
M = 000 1101 0000 0000 0000 0000
? A = 0100 0001 1000 1101 0000 0000 0000 0000
= 41 8D 00 00H
Ví dụ chuyển đổi
Ví dụ 2: -112,3125 ? IEEE 754/85
B1: B = -112,3125 = -1110000,0101
B2: B = -1,1100000101 * 26 (?1,aa...a * 2b)
B3: Ta có:
S = 1, vì B < 0
E - 127 = 6 ? E = 133 = 1000 0101
M = 110 0000 1010 0000 0000 0000
? A = 1100 0010 1110 0000 1010 0000 0000 0000
= C2 E0 A0 00H
Ví dụ chuyển đổi
Ví dụ 3: -19 / 64 ? IEEE 754/85
B1: C = -19 / 64 = -19 * (1 / 64)
B2: C = -10011 * 2-6 = -1,0011 * 2-2
B3: Ta có:
S = 1, vì C < 0
E - 127 = -2 ? E = 125 = 0111 1100
M = 001 1000 0000 0000 0000 0000
? A = 1011 1110 0001 1000 0000 0000 0000 0000
= BE 18 00 00H
Ví dụ chuyển đổi
Ví dụ 4: Tìm giá trị số thực: C2 0D 00 00H
Giải:
Ta có: X = C2 0D 00 00H =
= 1100 0010 0000 1101 0000 0000 0000 0000
S = 1 ? X < 0
E = 1000 0100 = 132 ? E -127 = 5
M = 000 1101 0000 0000 0000 0000
? X = -1,0001101 * 25 = -100011,01 = -35,25
Dạng kép: 64 bit
Khi đó, 1 số thực bất kỳ được biểu diễn:
X = (-1)S * 1,M * 2E - 1023
Dải giá trị biểu diễn:
2-1023 < ?X ?< 21023,
hay: 10-308 < ?X ?< 10308
Dạng kép mở rộng: 80 bit
Khi đó, 1 số thực bất kỳ được biểu diễn:
X = (-1)S * 1,M * 2E - 16383
Dải giá trị biểu diễn:
2-16383 < ?X ?< 216383,
hay: 10-4932 < ?X ?< 104932
Các quy ước đặc biệt
E = 0, M = 0 ? X = 0
x000 0000 0000 0000 0000 0000 0000 0000 = ?0
E = 11...1, M = 0 ? X = ??
x111 1111 1000 0000 0000 0000 0000 0000 = ??
E = 11...1, M ? 0 ? X: NaN (không phải số)
Biểu diễn ký tự
Bộ mã ASCII (American Standard Code for Information Interchange)
Bộ mã Unicode
Bộ mã ASCII
Do ANSI (American National Standard Institute) thiết kế
Là bộ mã 8 bit, có thể mã hóa được 28 ký tự, có mã từ 0016 ? FF16 , gồm:
128 ký tự chuẩn, có mã 0016 ? 7F16, gồm:
Các ký tự điều khiển: màn hình, máy tin, truyền tin.
Các ký tự soạn thảo văn bản
128 ký tự mở rộng, có mã 8016 ? FF16, gồm:
Các ký tự đặc biệt, kẻ khung, tiếng Pháp, ...
Bộ mã Unicode
Là bộ mã hợp nhất, do các hãng máy tính hàng đầu thiết kế
Là bộ mã 16 bit
Là bộ mã đa ngôn ngữ
Có hỗ trợ các ký tự tiếng Việt
Kiến trúc máy tính
Hết chương 2
Bài tập (các hệ đếm)
Bài 1: Đổi các số sau từ hệ thập phân ? hệ nhị phân:
a) 28; b) 89; c) 294
d) 34,5; e) 55,25; f) 46,3125
Bài 2: Đổi các số sau từ hệ nhị phân ? hệ thập phân:
a) 11001; b) 111001
c) 10111011; d) 10001001
Bài tập (các hệ đếm)
Bài 3: Đổi các số sau từ hệ thập phân ? hệ thập lục:
a) 68; b) 29; c) 215
Bài 4: Đổi các số sau từ hệ thập lục ? hệ thập phân:
a) AF; b) 123; c) 10D
Bài tập (biểu diễn số nguyên)
Bài 1: Biểu diễn các số sau dùng dấu và độ lớn (8 bit):
a) +69; b) +105; c) -28; d) -121
Bài 2: Biểu diễn các số sau dùng dấu và độ lớn (16 bit):
a) +109; b) +105; c) -98; d) -131
Bài 3: Biểu diễn các số sau dùng mã bù 2 (8 bit - không dấu):
a) 57; b) 48; c) 98; d) 131
Bài tập (biểu diễn số nguyên)
Bài 4: Biểu diễn các số sau dùng mã bù 2 (8 bit - có dấu):
a) +57; b) +48; c) -98; d) -31
Bài 5: Biểu diễn các số sau dùng mã bù 2 (16 bit - không dấu):
a) 157; b) 108; c) 128; d) 35
Bài 6: Biểu diễn các số sau dùng mã bù 2 (16 bit - có dấu):
a) 137; b) 119; c) -113; d) -53
Bài tập (biểu diễn số nguyên)
Bài 7: Có các biểu diễn sau (dùng dấu và độ lớn), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1001 1100
c) 0000 0000 1001 0010; d) 1000 0000 0110 1100
Bài 8: Có các biểu diễn sau (dùng mã bù 2 - không dấu), hãy xác định giá trị:
a) 0100 001 b) 1010 0100
c) 0000 0000 1001 0010; d) 1000 0000 0010 0100
Bài tập (biểu diễn số nguyên)
Bài 9: Có các biểu diễn sau (dùng mã bù 2 - có dấu), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1101 1100
c) 0000 0000 0101 0011; d) 1111 1111 1110 1110
Bài tập (các phép toán với số nguyên)
Bài 1: Cho biết kết quả khi thực hiện trên máy tính các phép cộng sau (8 bit) và giải thích:
a) 56 + 78 (không dấu); b) 121 + 40 (không dấu)
c) 68 + 40 (có dấu) ; d) 67 + (-100) (có dấu)
e) 102 + 88 (có dấu); f) (-80) + (-62) (có dấu)
Bài 2: Mô tả quá trình nhân trên máy tính các số 4 bit sau đây:
a) 13 * 7; b) 6 * 14; c) 15 * 14
d) (-5) * 3; e) 6 * (-2); f) (-7) * (-4)
Bài tập (các phép toán với số nguyên)
Bài 3: Mô tả quá trình chia trên máy tính các số sau đây:
a) 13 : 5; b) 10 : (-4)
c) (-11) : 6; d) (-14) : (-5)
Bài tập (biểu diễn số thực)
Bài 1: Biểu diễn các số sau theo chuẩn IEEE 754/85 32 bit:
a) 78,25; b) -23,625; c) 50,3125
d) -133/128 e) 20,15
Bài 2: Có các biểu diễn theo chuẩn IEEE 754/85 sau, xác định giá trị của chúng:
a) 41 8D 00 00H; b) C2 96 20 00H
c) 3E A0 00 00H; d) BC 91 00 00H
Bài tập (biểu diễn số thực)
Bài 3: Có các biểu diễn theo chuẩn IEEE 754/85 sau, xác định giá trị của chúng:
a) 10 00 00 00H; b) 7F 80 00 00H
c) FF 80 00 00H; d) 7F 80 00 10H







à em nhầm, em xin lỗi thầy..hihi!
thầy ơi thầy có đáp án phần bài tập không cho em với, em so xem có đúng không! em cảm ơn thầy!
Thầy ơi thầy cho em đáp án phần bài tập với nhé, em muốn xem mình làm có đúng không. Em cảm ơn thầy!
Trình bày quá trình nhân hai số bù -12 và + 8 theo giải thuật booth.
em cảm ơn rất nhiều!
A, 1/128
B, -12,125
C, -17/64
D, 19,625
Mấy cái phân số theo mình thì bạn nên sử dụng phép chia có dấu thì hay hơn chứ để như vậy rất khó khăn trong việc đổi