ในบทความที่แล้ว เราได้เรียนรู้วิธีที่คอมพิวเตอร์เก็บตัวเลขและบิตแรกเก็บป้าย
สมมติว่าเราคำนวณ 3 & -3 หากคุณแสดง 3 และ -3 เป็นเลขฐานสอง จะมีลักษณะดังนี้:
+3 => 00000011 -3 => 10000011
เนื่องจากเป็นตัวดำเนินการ &(AND) ที่นี่ ผลลัพธ์คือ 00000011 คุณคาดหวังว่าจะได้ 3 หรือไม่
หากคุณรัน 3 & -3 ใน Node.js REPL จริง ผลลัพธ์จะเป็น 1
อะไร เกิดอะไรขึ้น?
ขนาดที่ลงนามแล้ว
ขั้นแรก วิธีการแสดงเครื่องหมายด้วยบิตบนสุด 1 บิตและค่าสัมบูรณ์ของจำนวนเต็มพร้อมกับบิตที่เหลือเรียกว่า ขนาดที่มีเครื่องหมาย
เมื่อแสดงจำนวนลบบนคอมพิวเตอร์ จะไม่ใช้ขนาดที่มีเครื่องหมาย
มันใช้งานง่ายจากมุมมองของบุคคล แต่มีปัญหาที่ผลลัพธ์ที่ไม่ถูกต้องออกมาเมื่อคำนวณ
ตัวอย่างเช่น หากคุณแก้ 3 + (-3) ด้วยขนาดที่ลงนาม คุณจะได้ -6 ซึ่งเป็นค่าที่แตกต่างอย่างสิ้นเชิงจากคำตอบที่ถูกต้อง 0 ดังแสดงด้านล่าง:
+3 => 00000011 -3 => 10000011 + — — — — — — — — — — 10000110 => -6
ดังนั้น คอมพิวเตอร์ไม่ใช้ขนาดที่มีเครื่องหมายเมื่อแสดงจำนวนลบ
ขนาดที่เซ็นชื่อเป็นวิธีหนึ่งที่คอมพิวเตอร์แสดงจำนวนลบ วิธีหนึ่งหมายความว่ายังมีวิธีอื่นใช่ไหม?
วิธีอื่นๆ คือส่วนเสริมของ 1 และส่วนเสริมของ 2
เสริม
ส่วนประกอบ หมายถึง จำนวนอาหารเสริม เพื่อให้เข้าใจถึงส่วนเสริม เราต้องดูระบบตัวเลขก่อน
ในระบบตัวเลข N (ระบบทศนิยม ระบบไบนารี่ ฯลฯ...) มีส่วนเสริมของ N และส่วนเสริมของ N-1
ส่วนเสริมของ N
คำจำกัดความเสริมของ N คือ:
หากคุณบวก b เข้ากับจำนวน a ใดๆ แล้วคุณได้จำนวนของระบบเลข N แล้ว b จะเรียกว่าส่วนเสริมของ N ของ a
For examples, if 1 + b = 10, then b(=9) is 10’s complement of 1
ส่วนเสริมของ N-1
คำจำกัดความเสริมของ N-1 คือ:
หากคุณบวก b เข้ากับเลขใดๆ a และ [จำนวนของระบบเลข N-1] ถูกสร้างขึ้น แล้ว b จะเรียกว่าส่วนเสริมของ N-1 ของ a
For examples, if 1 + b = 9(10–1), then b(=8) is 9’s complement of 1
กล่าวอีกนัยหนึ่ง ส่วนเสริมของ N คือส่วนเสริมของ N-1 + 1
ตอนนี้เรารู้เกี่ยวกับส่วนเติมเต็มแล้ว เรามาดูกันว่าส่วนเสริมของ 1 คืออะไร
ส่วนเสริมที่ 1
ส่วนเสริมของ 1 คือ แสดงจำนวนลบโดยการกลับบิตทั้งหมดของจำนวนบวกนั้น
ตัวอย่างเช่น ถ้า 3 แสดงเป็นเลขฐานสองโดยใช้ส่วนเสริมของ 1 จะได้ผลลัพธ์ต่อไปนี้:
+3 => 00000011 => 1의 보수 법 적용 => 11111100 => -3
เมื่อใช้ส่วนเสริมของ 1 เราจะได้ผลลัพธ์ของ 3 + (-3) เป็น 0 ซึ่งเป็นคำตอบที่ถูกต้อง
แล้วปัญหาทั้งหมดจะได้รับการแก้ไข? น่าเสียดายที่คำตอบคือไม่
ส่วนเสริมของ 1 แก้ปัญหาการคำนวณตามขนาดเครื่องหมาย แต่มีปัญหาคือมีสองค่าที่แสดงถึง 0 (ตามขนาดเครื่องหมาย)
+0 => 00000000 -0 => 11111111
นอกจากนี้ ยังเกิดปัญหาการพกพาแบบ end-around-carry เมื่อทำการเพิ่ม
สิ้นสุดรอบพกพา
end-around-carry หมายถึงสถานการณ์ที่ผลลัพธ์ของ -0 + 1 คือ +0 ดังนั้นคุณต้องเพิ่มอีก 1 รายการเพื่อให้ได้ค่าที่ถูกต้อง
1110 => -1 1111 => -0 0000 => 0
ปัญหาไม่ได้รับการแก้ไขด้วยขนาดที่เซ็นชื่อและส่วนเสริมของ 1 ดังนั้นส่วนเสริมของ 2 จึงออกมา
คอมพิวเตอร์ใช้ส่วนเสริมของ 2 นี้เพื่อแสดงจำนวนลบ
ส่วนเสริม 2
ส่วนเสริมของ 2 คือ เพื่อแสดงจำนวนลบโดยการบวก 1 เข้ากับส่วนเสริมของ 1
ตัวอย่างเช่น ผลลัพธ์ของ 3 พร้อมด้วยส่วนเสริมของ 2 คือ:
Use 1’s complement -3 => 11111100 Adding 1 to 1’s complement 11111100 + 1 => 11111101 The result -3 => 11111101
ข้อสรุป
คอมพิวเตอร์ใช้ส่วนเสริมของ 2 เมื่อแสดงจำนวนลบ ผลลัพธ์ของ 3 & -3 คือ 1
+3 => 00000011 -3 => 11111101 3 & (-3) => 00000001 => 1
หากคุณพบว่าสิ่งนี้มีประโยชน์ โปรดคลิกปุ่มตบมือ 👏 ด้านล่างสองสามครั้งเพื่อแสดงการสนับสนุนผู้เขียน 👇