ทำไมตัวแปร Signed Integer ใช้ 2's complement
Pramoth Suwanpech
Posted on June 8, 2022
ในเลขฐานสิบเราใส่เครื่องหมายลบข้างหน้า เราเป็นมนุษย์เราก็เข้าใจได้ แต่ computer ต้องแปลงทุกสิ่งอย่างเป็นเลขฐานสองก่อน
จึงเกิดคำถามคือ เราจะแปลงเลขฐานสิบ Signed integer ไปเป็นเลขฐานสองอย่างไรดี จึงจะสามารถเอาเลขสองตัว (A และ -B) มาบวกกันแบบเลขฐานสองและสามารถแปลงกลับไปเป็นเลขฐานสิบได้ถูกต้อง โดยที่ไม่ต้องมีลอจิกพิเศษอะไรเพิ่มเติมและ space efficiency(เก็บค่าได้จำนวนมากสุด)
มีคนคิดหลายวิธี ข้อดีข้อเสียแตกต่างกันไป ผมจะนำเสนอสามวิธีที่มีคนคิดมาแล้ว ดังนี้
วิธีที่ 1.
เก็บโดยให้มี Signed bit เป็นสัญลักษณ์+- ไปเลย (Signed magnitude) เหมือนที่เราใช้ในเลขฐานสิบ โดยให้ Most sinificant bit(MSB) เป็น Sign bit เช่น 3 → 0011b ดังนั้น -3 ก็จะเป็น → 1011b
ซึ่งแบบนี้มันดูเข้าใจง่ายสำหรับมนุษย์เลยแหละ แต่มันมีข้อเสีย
- มันมีศูนย์สองตัวคือ +0 และ -0 (0000b →+0 และ 1000b → -0)
- 3+(-3) = 0 ใช่ไหม ไหนเราลองบวกมันหน่อยซิ
0011b (3)
+
1011b (-3)
1110b ?? 3+(-3) = -5 แทนที่จะเป็น 0 ดังนั้นวิธีนี้ไม่เหมาะแล้ว
วิธีที่ 2.
1's complement
ในวิธีที่ 1 เลขลบและเลขบวกเราแค่กลับบิตแรก(MSB) ส่วนวิธีนี้ให้กลับทุกบิต เช่น 3 --> 0011b ดังนั้น -3 --> 1100b จะสังเกตว่าบิตแรกถ้าเป็น 1 จะหมายถึงจำนวนลบเหมือนกับวิธีที่ 1 งั้นเราลองมาบวกกัน
0001b (1)
+
1100b (-3)
1101b // 1+(-3) = -2
-------------------------
0010b (2)
+
1100b (-3)
1110b // 2+(-3) = -1
-------------------------
0011b (3)
+
1100b (-3)
1111b // 3+(-3) = -0
เราสรุปได้ว่า
1101b = -2
1110b = -1
1111b = -0
ด้วยวิธีนี้ เราสามารถบวกลบเลขได้ปกติ เพียงแต่ว่ายังเหลือ 1 ปัญหาคือ ยังมี -0 อยู่(1111b)
วิธีที่ 3.
2's complement
วิธีที่ 2 เกือบดี เหลือปัญหาอีกข้อเดียว คือ -0 ซึ่งมันไม่ make sense ที่จะมี -0 ซึ่งทำให้เราเก็บค่าได้น้อยลง 1 ตัวด้วย
วิธีนี้แก้ไขได้ด้วยการเอา 1 มาบวกเข้าไปกับ 1's complement ดังนั้น -3 จะเป็น (1100+1) => 1101b
เราลองมาพิศูจน์กันว่า -0 จะหายไปรึป่าว
0001b (1)
+
1101b (-3)
1110b // 1+(-3) = -2
-------------------------
0010b (2)
+
1101b (-3)
1111b // 2+(-3) = -1
-------------------------
0011b (3)
+
1101b (-3)
0000b // Yes !! 3+(-3) = 0
เราสรุปได้ว่า
1110b = -2
1111b = -1
0000b = 0
จะเห็นว่า 2's complement perfect สุด
ดังนั้นตัวแปรที่เป็นเลขบวกและลบ(Signed) จึงจะถูกเก็บในรูปแบบ 2'complement นั่นเอง
Posted on June 8, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 27, 2024