สิ่งแรกที่เรียนรู้เกี่ยวคอมพิวเตอร์: มันเข้าใจแค่ 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 รัน
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
การออกแบบคอมพิวเตอร์ต้นๆ (EDVAC) เริ่มจากความต้องการคำนวณคณิตศาสตร์ซับซ้อนให้ง่ายและเร็ว
ความรับผิดชอบหลักอยู่ที่ Adders (วงจรบวกเลข 2 ตัว) เพราะ ลบ คูณ หาร ใช้ Adders ในวงจร
คอมพิวเตอร์ = เครื่องคำนวณเร็วพร้อมความสามารถทางตรรกะ การเข้าใจ Binary Arithmetic (จำนวนบวก/ลบ) เป็น Concept พื้นฐานสำคัญที่สุดของ Processor
ระบบไบนารีทำงานอย่างไร
อ่าน 872500 -> 872.5K มันทำอย่างไร?
Digit ขวาสุด = หน่วย (10⁰) ตัวที่ 2 = สิบ (10¹) ตัวที่ 3 = ร้อย (10²) โหลดด้วย Power of 10 = Base-10 System
Binary: น้ำหนักแต่ละตำแหน่งเพิ่มเป็น Power of 2 (2⁰, 2¹, 2²...)
00110101 = 53 ในฐานสิบ คอมพิวเตอร์แปล Binary เหมือนกัน: คูณ Digit กับน้ำหนัก รวมกัน
การบวก 0 และ 1
บวก Binary เหมือนฐานสิบ ตัวอย่าง: 1101 (13) + 1100 (12)
บิตหน่วย (2⁰): 1+0=1
บิตสิบสอง (2¹): 0+0=0
บิตยี่สิบสี่ (2²): 1+1=2 -> Binary 10 เก็บ 0 ลำเลย 1 (เหมือนเกิน 9 ในฐานสิบ)
บิตสามสิบสอง (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⁷ มากสุด)
โลกมีแค่จำนวนบวก -> จบแล้ว (เรารู้แทนจำนวนและบวก Binary แล้ว) แต่มีจำนวนลบด้วย!
ความสวยงามของ CPU Arithmetic Design อยู่ที่ "ลบ"
คอมพิวเตอร์แทนจำนวนลบและคำนวณอย่างไร? มาดู Encoding Approach
หมายเหตุ: ใช้ 4-bit Computer อธิบาย บิตที่ 5 = Overflow หลักการเดียวกันกับ 16/32/64-bit
Sign Magnitude Encoding (เครื่องหมาย + ขนาด)
1101 = -5 MSB = Sign Bit: 0=บวก, 1=ลบ บิตเหลือ = Magnitude
1101: Sign=1 (ลบ) Magnitude=101 (5) => -5
ดูดี แต่มี ปัญหาออกแบบร้ายแรง: บวก +4 และ -1 ควรได้ +3 (0011)
ผลลัพธ์ได้ 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):
ขั้นตอน 1: Invert Bits (0->1, 1->0) 0110 -> 1001 เรียกว่า One's Complement
ขั้นตอน 2: บวก 1 (0001) เข้า One's Complement -> 1010 = -6 ใน Two's Complement
Invert = One's Complement, +1 = Two's Complement ง่ายใช่ไหม?
ทดสอบบวก 0100 (+4) + 1111 (-1):
ได้ผลลัพธ์ถูกต้อง! บวกจำนวนเต็มได้โดยไม่กังวลเครื่องหมาย
OS/Programmer Decode 1100 (-4) ยังไง? คำนวณ Two's Complement ของ 1100 -> 0100 (+4) วางเครื่องหมายลบ -> -4
OS เห็น MSB=1 (ลบ) คำนวณ Two's Complement ได้คู่บวก วางเครื่องหมายลบ คืนค่า -4
ทำไม Two's Complement ถึงทำงานได้?
หาคู่ลบของ +42 ง่ายสุด: 0 - (+42) = -42 ทำซ้ำ: 0 - (-42) = +42 นี่คือคณิตศาสตร์พื้นฐานของ 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!