ในบทความที่แล้ว เราได้เรียนรู้วิธีที่คอมพิวเตอร์เก็บตัวเลขและบิตแรกเก็บป้าย

สมมติว่าเราคำนวณ 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

หากคุณพบว่าสิ่งนี้มีประโยชน์ โปรดคลิกปุ่มตบมือ 👏 ด้านล่างสองสามครั้งเพื่อแสดงการสนับสนุนผู้เขียน 👇

🚀เข้าร่วม FAUN และรับเรื่องราวที่คล้ายกันในกล่องจดหมายของคุณในแต่ละสัปดาห์