คอมพิวเตอร์เก็บข้อมูลโดยแทนข้อมูลอยู่ในรูปแบบ Binary หรือแสดงออกเป็นเลขฐานสองที่มีได้แค่ 0 และ 1 เรียงต่อกัน
แต่เลขฐานสองจะไม่มีความหมายอะไรเลย จนกว่าเราจะมานิยามให้มันว่าแต่ละชุดของตัวเลขแทนอะไรบ้าง
ดังนั้นจำนวนเต็มที่ติดลบก็เช่นกัน ถ้าเราจำกัดจำนวนบิตเอาไว้ที่ 8 บิต แสดงว่าเราจะสามารถเอาเลขฐานสอง 8 บิตนี้แทนสิ่งต่างๆได้ 256 สิ่ง (2 ยกกำลัง 8) เช่นถ้าแทนจำนวนเต็มที่ไม่ติดลบ เราแทนที่ได้คือ 0 ถึง 255
ดังนั้นถ้า 8 บิตแล้วเราอยากแทนที่ทั้งเลขบวก และ เลขลบ นั้นก็สามารถทำได้โดยการแบ่งจำนวนสัญลักษณ์ทั้ง 256 ตัวนั้นออก 128 ตัวใช้สำหรับเลขลบ อีก 128 ตัวใช้สำหรับ จำนวนที่ไม่เป็นลบ ดังนั้นเลขที่แทนที่ได้ก็จะเปลี่ยนเป็นช่วง -128 ถึง 127
ปัญหาต่อมาแล้วเราจะเอาเลขฐานสองแบบไหนล่ะที่แทนที่เลขลบทั้ง 128 ตัวนั้น
สิ่งที่ระบบคอมพิวเตอร์ส่วนใหญ่ที่เราใช้อยู่ปัจจุบันใช้เทคนิคที่เรียกว่า two's complement นั่นคือในเมื่อเราแบ่งเลขเป็นช่วง -128 จนถึง 127 แล้วนั้นก็ทำให้เลขบวกตั้งแต่ 128 ถึง 255 นั้นหายไป ดังนั้นเราจะเอาฐานสองที่เคยใช้แทน 128 จนถึง 255 นั่นละมาใช้แทนเลข -128 จนถึง -1
ถ้าเรียงเปรียบเทียบกันระหว่างระบบที่เราแทนที่แค่จำนวนเต็มกับจำนวนติดลบแบบ two's complement จะเป็นแบบนี้
0 1 2 3 ... 127 128 129 130 ... 255
0 1 2 3 ... 127 -128 -127 -126 ... -1
อาจจะดูแปลกๆ แต่ถ้าสังเกตดีๆจะพบว่ามันทำให้เลขขยับไปในทิศทางบวก 1 เหมือนเดิมจาก 128 จนถึง 255 และ -128 จนถึง -1
ประโยชน์ของ two's complement อีกอันนั้นคือถ้าเรามีฐานสองของเลขบวก เราสามารถคำนวณเลขฐานสองของจำนวนลบของสิ่งนั้นได้เช่น เรามีฐานสองของ 127 แบบนี้
127
ฐานสองคือ
01111111
วิธีหา -127 คือกลับบิตของ 127 จาก 0 เป็น 1 และ 1 เป็น 0 แล้วเอามาบวกด้วย 1 นั่นเอง
01111111
กลับบิต
10000000
แล้วบวก 1
10000001
10000001
ก็คือเลข 129 ในระบบที่ไม่มีเลขลบ แต่ก็เทียบได้เป็น -127 ในระบบที่มีจำนวนติดลบได้นั่นเอง
ส่วนถ้าเรามี -127 เราทำวิธีเดียวกันก็จะได้ฐานสองของ 127 กลับมาเช่นกัน
ประโยชน์อีกเรื่องสำหรับ two's complement นั่นคือ ทำให้เราสามารถลบเลขฐานสองได้โดยใช้แค่การบวกเลขฐานสองนั่นเอง เช่นเราต้องการลบ 100 - 50
เราสามารถเขียนได้เป็น 100 + (-50) นั่นคือให้เราหาเลขฐานสองของ -50 ก่อนแล้วค่อยเอาไปบวกกับ 100 นั่นเอง
100 ฐานสองคือ 01100100
50 ฐานสองคือ 00110010
ดังนั้น -50 ฐานสองคือ 11001101 + 1 = 11001110
100 + (-50) คือ
01100100 +
11001110 ได้
100110010
แต่ว่าระบบเราตอนนี้ใช้แค่ 8 บิตเราสามารถตัดบิตที่เกินไปได้เลยก็จะได้คำตอบเป็น 00110010 ซึ่งก็คือ 50 นั่นเองเป็นคำตอบของ 100 - 50
Top comments (0)