Số bù 2 & Số thực (Floating Point)
Quảng cáo • Advertisement
📢 Sponsor Ad
Google AdSense
lesson.content.title
lesson.content.subtitle
🎯 Mục tiêu bài học
Sau bài này, bạn sẽ hiểu cách máy tính biểu diễn số âm (Two's Complement) và số thực (Floating Point) — hai chủ đề ra thi FE rất nhiều.
1. Tại sao cần Số bù 2 (Two's Complement)?
🏠 Ví dụ đời thực
Hãy tưởng tượng bạn có một đồng hồ 12 giờ. Để đi ngược 3 giờ từ 12h, bạn có thể đi thuận 9 giờ (12 - 3 = 9). Máy tính cũng dùng cách tương tự: thay vì "trừ", nó "cộng với số bù 2"!
Máy tính không có dấu trừ (-). Để biểu diễn số âm, người ta dùng phương pháp Bù 2 (Two's Complement).
2. Cách tính Bù 2 (TỪNG BƯỚC)
Ví dụ: Biểu diễn -5 trong 8 bit.
| Bước | Mô tả | Giá trị |
|---|---|---|
| Bước 1 | Viết +5 dưới dạng binary | 0000 0101 |
| Bước 2 | Đảo tất cả bit (0→1, 1→0) = Bù 1 | 1111 1010 |
| Bước 3 | Cộng thêm 1 = Bù 2 | 1111 1011 |
Vậy 1111 1011 chính là -5 trong hệ bù 2 (8 bit).
💡 3 Mẹo nhận biết nhanh
- Bit đầu tiên (MSB): 0 → số dương, 1 → số âm
- Phạm vi n bit có dấu: -2^(n-1) đến +2^(n-1)-1
- 8 bit: -128 đến +127 (tổng 256 giá trị = 2⁸)
- 16 bit: -32,768 đến +32,767
📌 Thêm ví dụ: Tính -13 bù 2 (8 bit)
| +13 | 0000 1101 |
| Đảo bit | 1111 0010 |
| + 1 | 1111 0011 = -13 |
📌 Kiểm tra: Cộng -5 + 5 = 0?
| +5 | 0000 0101 |
| -5 | 1111 1011 |
| Cộng | 1 0000 0000 (bit thứ 9 bị tràn → bỏ) = 0000 0000 ✅ |
3. Số thực dấu phẩy động (IEEE 754)
Máy tính không thể lưu 3.14 như con người viết. Nó dùng ký hiệu khoa học nhị phân:
Số = (-1)^S × 1.M × 2^(E-127)
| Thành phần | Bit (32-bit float) | Ý nghĩa | Ví dụ |
|---|---|---|---|
| S (Sign) | 1 bit | Dấu (0=dương, 1=âm) | 0 → dương |
| E (Exponent) | 8 bit | Số mũ (bias 127) | 130 → mũ thực = 3 |
| M (Mantissa) | 23 bit | Phần thập phân | 101 → 1.101₂ |
⚠️ Lỗi làm tròn (Rounding Error) — CỰC KỲ HAY RA THI!
Thử trong JavaScript: 0.1 + 0.2 = 0.30000000000000004
Tại sao? Vì 0.1 không thể biểu diễn chính xác trong nhị phân (giống như 1/3 = 0.333... trong thập phân). Đây là hạn chế cố hữu của dấu phẩy động!
Giải pháp trong lập trình: Dùng số nguyên (ví dụ: tính tiền bằng "đồng" thay vì "nghìn đồng"), hoặc dùng thư viện BigDecimal.
📝 Tóm tắt nhanh
- Bù 2: Đảo bit + cộng 1 → biểu diễn số âm
- MSB = 0 → dương, MSB = 1 → âm
- Phạm vi 8 bit có dấu: -128 đến +127
- IEEE 754: Sign (1 bit) + Exponent (8 bit) + Mantissa (23 bit)
- Lỗi làm tròn: 0.1 + 0.2 ≠ 0.3 trong máy tính!
🎯 Câu hỏi ôn thi FE #1
Hỏi: Phạm vi giá trị của kiểu dữ liệu 8 bit có dấu (signed) là gì?
Đáp: -128 đến +127 (tổng 256 giá trị = 2⁸)
🎯 Câu hỏi ôn thi FE #2
Hỏi: Biểu diễn bù 2 của -7 trong 8 bit là gì?
Giải: +7 = 0000 0111 → Đảo = 1111 1000 → +1 = 1111 1001
🎯 Câu hỏi ôn thi FE #3
Hỏi: Tại sao 0.1 + 0.2 ≠ 0.3 trong JavaScript?
Đáp: Vì 0.1 và 0.2 không thể biểu diễn chính xác trong hệ nhị phân dấu phẩy động (IEEE 754), gây ra lỗi làm tròn (rounding error).
Quảng cáo • Advertisement
📢 Ad Space
Google AdSense