จัดเก็บค่าลบที่เซ็นชื่ออย่างไร


13

ฉันกำลังดูวิดีโอนี้เกี่ยวกับค่าสูงสุดและต่ำสุดของจำนวนเต็มที่ลงนามแล้ว

นำตัวอย่างของค่าที่มีเครื่องหมายบวก - 0000 0001 บิตแรกแสดงว่าจำนวนเป็นค่าบวกและ 7 บิตสุดท้ายเป็นตัวเลขเอง ดังนั้นจึงตีความได้ง่ายว่า +1

ทีนี้ลองดูตัวอย่างค่าลบที่มีเครื่องหมาย - 1,000 0000 ซึ่งออกมาเป็น -8 โอเคคอมพิวเตอร์สามารถเข้าใจได้ว่ามันเป็นค่าลบเพราะบิตแรก แต่มันเข้าใจได้อย่างไรว่า 000 0000 หมายถึง -8?

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


nl.wikipedia.org/wiki/Two%27s_complement สองชุดคือจำนวนเลขฐานสองที่เก็บไว้ในคอมพิวเตอร์
Pieter B

@PieterB บางทีคอมพิวเตอร์ของคุณ และอีกหลายคน ด้วยเหตุผลที่ดี! แต่ไม่ได้หมายความว่าเป็นวิธีเดียวเท่านั้น
underscore_d

ในแบบที่คุณชอบ ฉันคิดอย่างน้อย 256! วิธีการเก็บเลขฐานสอง (8 บิต) บนคอมพิวเตอร์ อย่างไรก็ตามส่วนใหญ่นั้นโง่อย่างไม่น่าเชื่อ
Caleth

C ไม่ได้ระบุเป็นส่วนใหญ่ว่าผู้ผลิตชิปตัดสินใจที่จะแสดงข้อมูลอย่างไร C ได้รับการคอมไพล์ไปยังรหัสเครื่องและระวังอย่าให้คำจำกัดความใหม่ว่าชิปจะเก็บหมายเลขไว้อย่างไร ใช้กฎเดียวกันกับหมายเลขจุดลอย ขึ้นอยู่กับผู้ผลิตชิปเพื่อกำหนดวิธีการจัดเก็บ ผู้ผลิตชิปส่วนใหญ่ใช้ส่วนประกอบของ 2 แต่ฉันแน่ใจว่ามีข้อยกเว้น
Berin Loritsch

คำตอบ:


29

มาตรฐาน C ไม่ได้มีอำนาจในการแสดงหมายเลขติดลบ

ในการใช้งานมากที่สุดที่คุณมีแนวโน้มที่จะพบลบลงนามจำนวนเต็มจะถูกเก็บไว้ในสิ่งที่เรียกว่าสมบูรณ์สอง วิธีที่สำคัญอื่น ๆ ของการจัดเก็บตัวเลขที่ติดลบลงนามที่เรียกว่าส่วนประกอบหนึ่งของ

เติมเต็มทั้งสองของจำนวน N-bit ถูกกำหนดให้เป็นx 2^N - xยกตัวอย่างเช่นการเติมเต็มทั้งสองของ 8 บิต1เป็นหรือ2^8 - 1 1111 1111เติมเต็มทั้งสองของ 8 บิต8เป็นซึ่งในไบนารี2^8 - 8 1111 1000สิ่งนี้สามารถคำนวณได้โดยการพลิกบิตของxและเพิ่มหนึ่ง ตัวอย่างเช่น:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

ส่วนประกอบหนึ่งของหมายเลข N-bit x ถูกกำหนดเป็น x โดยที่บิตทั้งหมดของมันพลิกโดยทั่วไป

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

ส่วนประกอบของสองมีข้อดีหลายประการมากกว่าส่วนเสริม ตัวอย่างเช่นไม่มีแนวคิด 'ศูนย์เชิงลบ' ซึ่งมีเหตุผลที่ดีที่ทำให้หลายคนสับสน การบวกการคูณและการลบจะทำงานเหมือนกันกับจำนวนเต็มที่ลงนามแล้วซึ่งถูกนำไปใช้กับสองส่วนที่เติมเต็มเช่นเดียวกับจำนวนเต็มที่ไม่ได้ลงนามเช่นกัน


19

มีสามวิธีที่รู้จักกันดีสำหรับการแสดงค่าลบในไบนารี:

  1. ขนาดเซ็นชื่อ นี่เป็นวิธีที่ง่ายที่สุดที่จะเข้าใจเพราะมันทำงานเหมือนกับที่เราคุ้นเคยเมื่อจัดการกับค่าทศนิยมลบ: ตำแหน่งแรก (บิต) แทนเครื่องหมาย (0 สำหรับค่าบวก, 1 สำหรับค่าลบ) และบิตอื่น ๆ แทนตัวเลข . แม้ว่ามันจะง่ายสำหรับเราที่จะเข้าใจ แต่มันก็ยากสำหรับคอมพิวเตอร์ที่จะทำงานโดยเฉพาะอย่างยิ่งเมื่อทำเลขคณิตที่มีตัวเลขติดลบ
    ในขนาดเซ็นชื่อ 8 บิตค่า 8 จะแสดงเป็น 0 0001000 และ -8 เป็น 1 0001000

  2. หนึ่งของการเติมเต็ม ในการเป็นตัวแทนนี้จำนวนลบจะถูกสร้างขึ้นจากจำนวนบวกที่สอดคล้องกันโดยการพลิกบิตทั้งหมดและไม่ใช่แค่เครื่องหมายบิต สิ่งนี้ทำให้การทำงานกับตัวเลขติดลบสำหรับคอมพิวเตอร์ง่ายขึ้น แต่มีความยุ่งยากว่ามีการแทนสองแบบที่แตกต่างกันสำหรับ +0 และ -0 การพลิกของบิตทั้งหมดทำให้ยากต่อการเข้าใจสำหรับมนุษย์
    ในส่วนเสริมหนึ่งบิต 8 บิตค่า 8 ถูกแทนด้วย 00001000 และ -8 เป็น 11110111

  3. ส่วนประกอบสองอย่าง นี่เป็นการนำเสนอที่พบบ่อยที่สุดที่ใช้กันทุกวันนี้สำหรับจำนวนเต็มลบเพราะมันเป็นวิธีที่ง่ายที่สุดในการทำงานกับคอมพิวเตอร์ แต่มันก็ยากที่สุดที่จะเข้าใจมนุษย์ เมื่อเปรียบเทียบรูปแบบบิตที่ใช้สำหรับค่าลบระหว่างส่วนประกอบหนึ่งและส่วนประกอบสองนั้นจะสามารถสังเกตได้ว่ารูปแบบบิตเดียวกันในส่วนเติมเต็มของสองเข้ารหัสสำหรับจำนวนที่ต่ำกว่าต่อไป ตัวอย่างเช่น 11111111 ย่อมาจาก -0 ในส่วนเสริมและสำหรับ -1 ในส่วนเติมเต็มของสองและในทำนองเดียวกันสำหรับ 10,000000 (-127 เทียบกับ -128)
    ในส่วนเสริม 8 บิตสองค่า 8 แสดงเป็น 00001000 และ -8 เป็น 11111000


8
ขนาดที่เซ็นชื่อมีสองศูนย์
Jörg W Mittag

+1 สำหรับการกล่าวถึงสัญลักษณ์ / ขนาด ผิดปกติและไม่สะดวก (สำหรับซีพียูถ้าไม่ใช่มนุษย์!) แต่ควรค่าแก่การรู้
underscore_d

เกือบทั้งหมดของเราทำงานด้วยขนาดที่เซ็นชื่อโดยเฉพาะกับหมายเลข FP
Paulo1205

2

จำนวนเต็มที่ลงนามจะถูกเก็บไว้โดยใช้http://en.wikipedia.org/wiki/Two%27s%20complement

จากนั้นคุณจะได้รับ:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

โดยพื้นฐานแล้วมันง่ายมากที่จะนับคุณนับจนถึงจำนวนเต็มสูงสุดครึ่งหนึ่งที่ลงนามแล้ว ทำ +1 ทำให้เป็นลบและเริ่มนับถอยหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.