Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ฮาร์ดแวร์ >> CPU

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two's Complement และการนำไปใช้

สิ่งแรกที่เรียนรู้เกี่ยวคอมพิวเตอร์: มันเข้าใจแค่ 0 และ 1 หรือ Bits

มนุษย์ใช้ระบบฐานสิบ (0-9) พร้อมเครื่องหมาย + และ - บอกจำนวนบวก/ลบ

คอมพิวเตอร์ใช้ได้แค่ 0 และ 1 วิศวกรและนักคณิตศาสตร์สมัยก่อนออกแบบเทคนิคอัจฉริยะ แทนจำนวนลบ และคำนวณกับมัน มาสำรวจความสวยงามของเทคนิคเหล่านี้

พื้นฐานการทำงานของคอมพิวเตอร์

Software, Images, Text, Videos, Numbers ทุกอย่างเป็น 0 และ 1 ที่ระดับต่ำสุด

มี Encoding Schemes: ASCII/Unicode สำหรับ Text, Compiler/Assembler แปลงโค้ดเป็น Machine Code เก็บใน RAM ก่อน Processor รัน

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้
Fetch-Decode-Execute Cycle โดย Sir John von Neumann ทุกคอมพิวเตอร์ดิจิทัลทำตามรอบนี้

Processor เริ่มรอบ: Fetch คำสั่งจาก RAM -> Control Unit Decode เป็น 2 ส่วน: Opcode (Operation Code) และ Operands

Opcode บอกการกระทำ: ADD, JMP, INC... Operands = ค่าหรือที่อยู่หน่วยความจำที่จะปฏิบัติการ

ส่งไป ALU (Arithmetic Logic Unit) Execute ผลลัพธ์เก็บกลับ Memory

ตัวอย่าง: ADD eax, 42 -> Machine Code -> RAM -> Fetch -> Decode: Opcode=ADD, Operands=eax, 42

eax = Register (หน่วยความจำใน Processor เข้าถึงทันที) เรียกว่า Accumulator

ADD eax, 42 = eax = eax + 42 หาก eax=20 ผลลัพธ์=62

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้
EDVAC คอมพิวเตอร์ไบนารีต้นๆ สำหรับ Army Ballistics Research Lab

การออกแบบคอมพิวเตอร์ต้นๆ (EDVAC) เริ่มจากความต้องการคำนวณคณิตศาสตร์ซับซ้อนให้ง่ายและเร็ว

ความรับผิดชอบหลักอยู่ที่ Adders (วงจรบวกเลข 2 ตัว) เพราะ ลบ คูณ หาร ใช้ Adders ในวงจร

คอมพิวเตอร์ = เครื่องคำนวณเร็วพร้อมความสามารถทางตรรกะ การเข้าใจ Binary Arithmetic (จำนวนบวก/ลบ) เป็น Concept พื้นฐานสำคัญที่สุดของ Processor

ระบบไบนารีทำงานอย่างไร

อ่าน 872500 -> 872.5K มันทำอย่างไร?

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

Digit ขวาสุด = หน่วย (10⁰) ตัวที่ 2 = สิบ (10¹) ตัวที่ 3 = ร้อย (10²) โหลดด้วย Power of 10 = Base-10 System

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

Binary: น้ำหนักแต่ละตำแหน่งเพิ่มเป็น Power of 2 (2⁰, 2¹, 2²...)

00110101 = 53 ในฐานสิบ คอมพิวเตอร์แปล Binary เหมือนกัน: คูณ Digit กับน้ำหนัก รวมกัน

การบวก 0 และ 1

บวก Binary เหมือนฐานสิบ ตัวอย่าง: 1101 (13) + 1100 (12)

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

บิตหน่วย (2⁰): 1+0=1

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

บิตสิบสอง (2¹): 0+0=0

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

บิตยี่สิบสี่ (2²): 1+1=2 -> Binary 10 เก็บ 0 ลำเลย 1 (เหมือนเกิน 9 ในฐานสิบ)

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

บิตสามสิบสอง (2³): 1+1+1(ลำเลย)=3 -> Binary 11 เขียน 11

ผลลัพธ์ 11001 = 25 (13+12)

สมมติ 4-bit Computer: มี 4 บิตเก็บผลลัพธ์ บิตที่ 5 = Overflow (ทิ้ง/ละเลย) ผลลัพธ์ได้ 1001 (9) แทน

ความสวยงามของ Binary Arithmetic Design

2 ตัวสำคัญ: Least Significant Bit (LSB) = บิตขวาสุด (น้ำหนัก 2⁰ น้อยสุด) Most Significant Bit (MSB) = บิตซ้ายสุด (น้ำหนัก 2⁷ มากสุด)

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

โลกมีแค่จำนวนบวก -> จบแล้ว (เรารู้แทนจำนวนและบวก Binary แล้ว) แต่มีจำนวนลบด้วย!

ความสวยงามของ CPU Arithmetic Design อยู่ที่ "ลบ"

คอมพิวเตอร์แทนจำนวนลบและคำนวณอย่างไร? มาดู Encoding Approach

หมายเหตุ: ใช้ 4-bit Computer อธิบาย บิตที่ 5 = Overflow หลักการเดียวกันกับ 16/32/64-bit

Sign Magnitude Encoding (เครื่องหมาย + ขนาด)

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

1101 = -5 MSB = Sign Bit: 0=บวก, 1=ลบ บิตเหลือ = Magnitude

1101: Sign=1 (ลบ) Magnitude=101 (5) => -5

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้
จำนวนเต็มทั้งหมดที่ 4-bit แทนได้ด้วย Sign Magnitude

ดูดี แต่มี ปัญหาออกแบบร้ายแรง: บวก +4 และ -1 ควรได้ +3 (0011)

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

ผลลัพธ์ได้ 1101 (-5) ผิด! ต้องเพิ่ม Logic จัดการ -> Complex, ใช้พลังงานมาก, ช้าลง

สมัย EDVAC ใช้ Vacuum Tubes พันหลอด กินไฟ Kilowatts ใช้คนร้อยๆ ดูแล รัฐบาลลงทุนล้านดอลลาร์ เพิ่มวงจร = ค่าใช้จ่ายสูง ปัญหา Maintenance

วิศวกรต้องหา Encoding Design อัจฉริยะกว่า

Two's Complement: ระบบเข้ารหัสอันสวยงาม ❤️

MSB ยังเป็น Sign Bit แต่แทนจำนวนลบด้วย "ศิลปะ"

จำนวนบวก: แทนเหมือนเดิม (Leading 0 + Magnitude) เช่น 6 = 0110

จำนวนลบ: ทำกระบวนการคณิตศาสตร์ 2 ขั้นตอน บนคู่บวก เพื่อได้คู่ลบ

หา -6 จาก +6 (0110):

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

ขั้นตอน 1: Invert Bits (0->1, 1->0) 0110 -> 1001 เรียกว่า One's Complement

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

ขั้นตอน 2: บวก 1 (0001) เข้า One's Complement -> 1010 = -6 ใน Two's Complement

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

Invert = One's Complement, +1 = Two's Complement ง่ายใช่ไหม?

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้
จำนวนเต็มทั้งหมด 4-bit ด้วย Two's Complement

ทดสอบบวก 0100 (+4) + 1111 (-1):

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

ได้ผลลัพธ์ถูกต้อง! บวกจำนวนเต็มได้โดยไม่กังวลเครื่องหมาย

OS/Programmer Decode 1100 (-4) ยังไง? คำนวณ Two's Complement ของ 1100 -> 0100 (+4) วางเครื่องหมายลบ -> -4

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

OS เห็น MSB=1 (ลบ) คำนวณ Two's Complement ได้คู่บวก วางเครื่องหมายลบ คืนค่า -4

ทำไม Two's Complement ถึงทำงานได้?

หาคู่ลบของ +42 ง่ายสุด: 0 - (+42) = -42 ทำซ้ำ: 0 - (-42) = +42 นี่คือคณิตศาสตร์พื้นฐานของ Two's Complement

CPU จัดการจำนวนเต็มลบอย่างไร? หลักการ Two s Complement และการนำไปใช้

10000 (0 ในฐานสิบ เพราะบิตซ้ายสุดลำเลย = Overflow) ลบ 0101 (+5) = 1011 (-5)

10000 = 1111 + 0001 (ลองบวกดู ได้ 10000) ดังนั้น:

10000 - 0101 = (1111 + 0001) - 0101
= (1111 - 0101) + 0001

Step 1: 1111 - 0101 = 1010 (เหมือน Invert Bits ของ 0101!)
Step 2: 1010 + 0001 = 1011 (-5 ใน Two's Complement)

Two's Complement ทำ 0 - Number อย่างอ้อมๆ Invert + Add 1 = วิธีเร็วและฉลาด ลบจาก 0

เพราะนี้ จึงได้คู่บวกจากคู่นลบ และคู่นลบจากคู่บวก เมื่อคำนวณ Two's Complement (เพราะทำ 0 - Number)

คอมพิวเตอร์สมัย 1900s มีแค่ Addition Logic เพราะ Two's Complement สวยงามจน Subtraction ทำได้ง่าย

ตัวอย่าง: 100 - 12 -> CPU คำนวณ Two's Complement ของ +12 ได้ -12 -> บวก -12 กับ 100 ได้ผลลัพธ์

ทำไมไม่ลบจาก 0 โดยตรง? เพราะ Subtraction ช้าและซับซ้อน (Borrowing) ต้องมีวงจรลบแพงๆ

Two's Complement = โซลูชันประสิทธิภาพดี วงจรง่าย ประหยัดเงิน ไม่ต้องวงจรลบแพง ไม่ต้อง Logic เพิ่มจัดการ +/- แค่บวกอย่างเดียว ทำได้ทั้งบวกและลบ

ชื่นชมวิศวกรคอมพิวเตอร์สำหรับ Encoding Scheme สวยงามนี้ - Two's Complement ❤️

สรุป

ขอสัญญา: ไม่คิดค่าเรียนรู้ทุกอย่างที่ผลิต บทความ คอร์ส Ebook = 100% ฟรีและเปิด

ทวีททรัพยากรดีๆ และความคิดที่มีความหมาย ติดตาม Twitter ส่ง DM ถ้าเรียนรู้ใหม่จากบทความ จะทำให้วันผมดีใจ :)

ทุก Developer, Author, Human เรียนรู้จากใครบ้าง ควร Cite และเผยแพร่คน/ทรัพยากรที่ดี เพื่อให้พวกเขาทำต่อไปได้

ขอบคุณ: Animesh (mycodeschool) สอน Programming Concepts รวม Two's Complement, André Jaenisch (Mentor/Friend) Review และสนับสนุนตลอด

Happy Learning!