Computer >> Hướng Dẫn Máy Tính >  >> Phần Cứng >> CPU

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Điều đầu tiên học về máy tính: chúng chỉ hiểu 0 và 1, hay bit.

Con người giao tiếp số qua hệ thập phân (0-9) kèm dấu + và - cho số dương/âm.

Máy tính chỉ có 2 chữ số (0, 1) → kỹ sư và toán học gia xưa thiết kế kỹ thuật thông minh để biểu diễn số âm và tính toán với chúng. Khám phá vẻ đẹp của kỹ thuật đó.

Trước Hết: Cách Máy Tính Hoạt Động

Phần mềm, ảnh, text, video, số... ở cấp thấp nhất đều là 0 và 1.

Đối với ảnh, text, video, số: có схéma mã hóa (encoding) quyết định cách chuyển thành 0/1. Ví dụ: ASCII, Unicode cho text.

Chương trình code qua compiler/assembler thành mã máy (machine code – chuỗi 0/1) lưu trong RAM trước khi processor thực thi.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế
Chu kỳ fetch-decode-execute do Sir John von Neumann kiến trúc. Mọi máy tính số đều tuân theo chu kỳ này.

Processor bắt đầu chu kỳ: fetch lệnh từ RAM, control unit decode thành 2 phần: opcode (mã phép toán) và operands (toán hạng).

Opcode quyết định hành động: ADD (cộng), JMP (nhảy), INC (tăng)... Operands là giá trị hoặc địa chỉ bộ nhớ thực hiện phép toán.

Lệnh đã decode gửi đến ALU (Arithmetic and Logic Unit) để execute. ALU thực thi dựa trên opcode trên operands, kết quả lưu lại bộ nhớ.

Ví dụ: assembly ADD eax, 42 → assembler dịch thành mã máy (0/1) → lưu RAM → fetch-decode-execute.

Fetch xong, decode: opcode = ADD, operands = eax và 42.

eax = register (vị trí nhớ trong processor, truy cập tức thì). eax gọi là accumulator (bộ tích lũy).

ADD eax, 42 cộng 42 vào giá trị hiện tại của eax, lưu tổng vào eax (eax = eax + 42).

Giả sử eax = 20. Sau ADD eax, 42 → eax = 62.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế
EDVAC – máy tính nhị phân điện tử sớm nhất cho Lab đạn đạo Mỹ. (Nguồn công cộng).

Thiết kế máy tính sớm (EDVAC) xuất phát từ khát vọng tính toán toán học phức tạp nhanh hơn, dễ hơn.

Trách nhiệm tính toán nằm trên adder (mạch cộng) – mạch cộng 2 số. Vì phép trừ, nhân, chia dùng adder trong mạch.

Cuối cùng máy tính là máy tính toán nhanh có khả năng logic. Hiểu thách thức và vẻ đẹp của thiết kế số học nhị phân (số nguyên dương và đặc biệt là âm) là khái niệm cốt lõi nhất trong processor.

Trước xem cách biểu diễn số thập phân trong nhị phân và cộng 2 số nhị phân. Sau đó khám phá vẻ đẹp.

Hệ Nhị Phân Hoạt Động Như Thế Nào

Nếu nhờ bạn đọc 872500, bạn nói 872.5K. Xem não bộ xử lý thế nào.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Gán hàng đơn vị cho chữ số đầu tiên từ phải, hàng chục cho số 2 từ phải, hàng trăm cho số 3... trọng số mỗi hàng tăng lũy thừa 10.

Trọng số hàng trăm = 100. Nhân chữ số mỗi hàng với trọng số, cộng lại → số hoàn chỉnh.

Trọng số tăng theo lũy thừa 10: từ 10^0 đến 10^5. Đó là hệ cơ số 10.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Nhị phân: trọng số mỗi hàng tăng lũy thừa 2. Từ 2^0 đến 2^something. Chỉ khác ở chỗ này.

00110101 nhị phân = 53 thập phân. Máy tính đọc nhị phân như người đọc thập phân: nhân chữ số với trọng số hàng, cộng tổng.

Cách Cộng 1 Và 0

Cộng nhị phân giống cộng thập phân. Ví dụ: 1101 (13) + 1100 (12).

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Bắt đầu hàng đơn vị (2^0): 1+0=1 → ghi 1.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

0+0=0 → ghi 0.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

1+1=2. Nhị phân 2 = 10. Nhớ 1 sang hàng tiếp, giữ 0 tại hàng hiện tại. Giống vượt quá 9 trong cộng thập phân?

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Hàng tiếp: hai 1 + 1 nhớ = ba 1. Tổng = 3. Nhị phân 3 = 11 → ghi 11. Kết quả 11001 = 25 thập phân = 13+12.

Giả sử có 5 bit lưu kết quả. Nếu máy 4-bit chỉ có 4 bit lưu → bit thứ 5 gọi là overflow. Số học nguyên: bit overflow bị bỏ qua. Kết quả 4-bit = 1001 (9).

Vẻ Đẹp Của Thiết Kế Số Học Nhị Phân

Hai thuật ngữ quan trọng: least significant bit (LSB) và most significant bit (MSB).

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Bit bên phải nhất = LSB (trọng số nhỏ nhất 2^0). Bit bên trái nhất = MSB (trọng số lớn nhất 2^7).

Nếu chỉ có số dương, bài viết kết thúc ở đây (đã biết biểu diễn thập phân nhị phân và cộng).

May mắn là có số âm.

Vẻ đẹp thiết kế số học CPU nằm ở tính âm.

Máy tính biểu diễn số âm như thế nào? Phép toán số âm hoạt động ra sao? Xem cách tiếp cận mã hóa (encoding).

Lưu ý: Phần dưới dùng máy 4-bit để hiểu khái niệm → bit thứ 5 = overflow. Nguyên lý áp dụng cho mọi kiến trúc CPU: 16-bit, 32-bit, 64-bit.

Cách Mã hóa Sign-Magnitude (Dấu-Kích Thước)

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

1101 nhị phân = -5 trong scheme này. Bit trái nhất (MSB) = sign bit (bit dấu). Chỉ cho processor biết dấu số: dương hay âm.

0 ở sign bit = dương. 1 = âm. Các bit còn lại cho magnitude (kích thước).

1101: sign bit = 1 → âm. 101 = 5 thập phân → 1101 = -5.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế
Tất cả số nguyên 4-bit có thể biểu diễn với sign bit

Trông ổn cho đến khi nhìn kỹ: vấn đề thiết kế nghiêm trọng. Đối mặt vấn đề đó.

Cộng số dương và âm. Ví dụ: +4 và -1. Kết quả mong đợi: (+4) + (-1) = (+3) = 0011.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Kết quả thực: 1101 (-5). Đúng phải 0011 (+3). Nếu triển khai cách này trên processor → cần logic thêm xử lý vấn đề này. Kỹ sư ghét độ phức tạp thêm.

Thêm mạch → tiêu thụ điện tăng, hiệu năng giảm.

Có vẻ vấn đề nhỏ với transistor hiện đại.

Nhưng máy tính sớm như EDVAC chạy bằng hàng ngàn ống chân không, tiêu thụ kilowatt, vận hành bởi trăm người/ngày. Chi phí triệu đô. Thêm mạch/ống chân không = hàng nghìn đô và rắc rối bảo trì.

→ Kỹ sư phải tìm mã hóa thông minh hơn.

Giờ khám phá vẻ đẹp giải quyết vấn đề, làm hệ thống đơn giản, hiệu năng hơn, ít tiêu thụ điện hơn.

Một Hệ Mã Hóa Tuyệt Đẹp Xuất Hiện & CPU Sáng Giá ❤️

Scheme này: bit trái nhất vẫn làm sign bit – nhưng có "nghệ thuật" biểu diễn số âm.

Số dương biểu diễn giống scheme trước: bit đầu 0, bit còn lại magnitude. Ví dụ: 6 = 0110.

Để biểu diễn số âm: chạy quy trình toán học 2 bước trên đối ứng dương. Tức: để có -6, làm 2 bước trên +6 để ra -6 nhị phân.

Xem -6 mã hóa như thế nào:

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Scheme sign-magnitude: để lấy âm của +6, chỉ đổi sign bit 0→1. 0110 (+6) → 1110 (-6).

Scheme mới: Bước 1: đảo bit (0→1, 1→0). 0110 (+6) → 1001. Đảo bit = "one's complement" (bổ sung 1). Bước 2: cộng 0001 (+1) vào one's complement (1001). Kết quả 1010 = biểu diễn nhị phân của -6. Scheme này gọi là two's complement (bổ sung 2). Nhớ: two's complement của số dương cho đối ứng âm.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Đảo bit → one's complement. Cộng 1 vào one's complement → two's complement của bit gốc. Đơn giản, phải không?

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế
Tất cả số 4-bit có thể biểu diễn với two's complement

Tại sao scheme này đẹp? Cộng 0100 (+4) và 1111 (-1).

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Kết quả chính xác! Cộng số nguyên không lo dấu.

Đã học biểu diễn số âm qua two's complement. Giả sử thực thi ADD eax, -3, eax hiện tại = -1. Sau thực thi eax = -4 (1100 two's complement).

Khi OS lấy 1100 từ eax hiện thị cho user, OS decode 1100 thành thập phân như thế nào? Hoặc lập trình viên thấy 1100, biết nó đại diện số gì?

Không thể liên tục tính two's complement từng số dương cho đến khi trúng 1100. Quá chậm.

OS và lập trình viên dùng tính chất đẹp của two's complement để decode nhị phân → thập phân.

Two's complement của số dương cho số âm. Ngược lại cũng đúng – two's complement của số âm cho số dương. Sẽ thấy tại sao ngay.

Cách OS/lập trình viên decode 1100:

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Lấy 1100 từ eax, OS thấy sign bit 1 → số âm. Tính two's complement của 1100 → đối ứng dương = 0100 (+4). OS thêm dấu âm → kết quả -4. Đọc lại đoạn này để hiểu rõ.

CPU mỉm cười tạm biệt vẻ đẹp hôm nay ;)

CPU về nhà gặp mẹ. Chúng ta có thời gian thảo luận cơ chế nội tại của two's complement.

Tại Sao Và Như Thế Nào Two's Complement Hoạt Động?

Nếu nhờ bạn tìm số âm của +42, cách đơn giản nhất? Trừ số từ 0: 0 - (+42) = -42. Lặp lại: 0 - (-42) = +42. Toàn bộ toán học two's complement xây trên này.

CPU Xử Lý Số Nguyên Âm Như Thế Nào: Nguyên Lý Thiết Kế & Triển Thực Thực Tế

Làm 10000 (0 thập phân vì bit 1 trái nhất là overflow) trừ 0101 (+5). Kết quả 1011 = -5 thập phân trong two's complement. Bỏ qua cách trừ. Quan trọng: hiểu trực giác two's complement.

10000 = 1111 + 0001 (thử cộng: ra 10000). Thực chất đang làm:

10000 - 0101 = (1111 + 0001) - 0101

Sắp xếp lại:

(1111 + 0001) - 0101 = (1111 - 0101) + 0001
Bước 1: trừ 0101 từ 1111
  1 1 1 1
- 0 1 0 1
---------
  1 0 1 0  ← thấy không, trừ 0101 từ 1111 tương đương đảo bit của 0101 (được 1010).
Bước 2: cộng 0001 vào kết quả bước 1
  1 0 1 0
+ 0 0 0 1
---------
  1 0 1 1  ← được 1011 = -5 two's complement.

Thấy chưa: two's complement cơ bản làm 0 - số. Đảo bit và cộng 1 là cách nhanh, thông minh để trừ số từ 0.

Đó là lý do two's complement của số âm cho dương, dương cho âm – vì thực chất làm 0 - số.

Máy tính thập niên 1900 chỉ có mạch cộng (addition logic) vì two's complement đẹp đến mức trừ dễ dàng thực hiện.

Ví dụ: trừ 12 từ 100 → CPU tính two's complement của +12 ra -12 → cộng -12 vào 100 → kết quả.

Tại sao không trực tiếp trừ từ 0 để tìm số âm hoặc ngược lại trong nhị phân?

Vì trừ chậm và phức tạp (do mượn – borrowing) → cần mạch trừ đắt tiền. Trừ từ 0 mỗi lần biểu diễn số âm = ác mộng cho ta và máy tính!

Two's complement: giải pháp hiệu năng cao, thiết kế mạch đơn giản, tiết kiệm tiền. Không cần mạch trừ đắt tiền, không logic thêm cho phép toán +/-. Chỉ cộng đơn thuần – vừa cộng vừa trừ.

Trân trọng các nhà thiết kế máy tính cho scheme tuyệt đẹp này – two's complement ❤️.

Lời Kết

Tôi hứa không bao giờ thu phí tài liệu học tập. Bất cứ gì làm cho giáo dục: bài viết, khóa học, ebook – luôn 100% miễn phí và mở.

Đăng tài nguyên hữu ích và suy nghĩ sâu sắc trên Twitter. Follow và DM nếu bài viết giúp bạn học được điều mới. Sẽ làm vui ngày của tôi :)

Mọi developer, tác giả, con người đều học từ ai đó. Tôi tin người và tài nguyên chúng ta học nên được trích dẫn và lan tỏa. Khuyến khích những người tốt làm thêm cho cộng đồng. Dưới đây là "người tốt" của tôi.

Animesh (mycodeschool) dạy nhiều khái niệm lập trình tốt hơn ai hết, bao gồm khái niệm bài viết này.

André Jaenisch, mentor và bạn, nhờ review và hỗ trợ không ngừng tôi mới viết được bài này.

Học tập vui vẻ!