ทำไมค่าต่ำสุดของ ints, double, etc 1 ไกลจากศูนย์มากกว่าค่าบวก


10

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


3
ส่วนที่น่ารังเกียจจริงๆของเรื่องนี้ก็คือ Abs (MinValue) เป็นลบ
OldFart

1
ใน java Double.MIN_VALUE เป็นที่เล็กที่สุดในเชิงบวกค่าและ (จริง) ตัวเลขห่างจากศูนย์มีขนาดเท่ากัน (มันมีบิตที่เหมาะสมเข้าสู่ระบบ)
วงล้อประหลาด

คำตอบ:


16

คิดในแง่เหล่านี้ ใช้ตัวเลข 2 บิตพร้อมกับเครื่องหมายก่อนหน้า:

000 = 0
001 = 1
010 = 2
011 = 3

ตอนนี้เรามีข้อเสียบางอย่าง:

111 = -1
110 = -2
101 = -3

เดี๋ยวก่อนเราก็มี

100 ... 

มันจะต้องเป็นค่าลบเนื่องจาก sign-bit คือ 1 ดังนั้นเหตุผลต้องมี -4

(แก้ไข: เนื่องจากWorldEngineer ชี้ให้เห็นอย่างถูกต้องระบบการเรียงลำดับทั้งหมดไม่ทำงานด้วยวิธีนี้ แต่เป็นสิ่งที่คุณถามเกี่ยวกับการทำ)


11

เนื่องจากไม่มีตัวเลขสองคลาสในช่วงจำนวนเต็ม แต่มีสาม: จำนวนลบจำนวนศูนย์และจำนวนบวก Zero ต้องใช้สล็อต (ค่อนข้างจะเป็นไปไม่ได้ที่จะไม่สามารถเป็นศูนย์ได้ ... ) ดังนั้นคลาสบวกหรือลบต้องยอมแพ้สล็อต ความจริงที่ว่ามันมักจะเป็นช่วงบวกที่จะต้องเสียสละนั่นคือในระดับหนึ่งโดยพลการ แต่ในระดับบิตของกิจวัตรมีบางสิ่งที่การตัดสินใจครั้งนี้สะดวกกว่า


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

4

มีสามวิธีพื้นฐานในการแสดงจำนวนเต็มที่ลงนามในไบนารี: ส่วนประกอบของ 2, ส่วนประกอบ 1 ของและขนาดสัญญาณ (ของเก่าไปตามทางของนกโดโดเมื่อนานมาแล้ว)

1 ส่วนเติมเต็มและขนาดสัญญาณมีสองค่าศูนย์ +0 และ -0 แต่ละค่ามีการแทนค่าที่ไม่ซ้ำกัน ส่วนประกอบ 2 มีค่าศูนย์เดียวเท่านั้นและมีตัวแทนเพียงหนึ่งค่า

ตอนนี้เขตข้อมูลของบิต N บิตสามารถเข้ารหัสค่า 2 ^ N ได้ ลบส่วนเติมเต็มหนึ่งใน 2 และคุณมี 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1 เนื่องจากการแทนค่าของศูนย์คือศูนย์บิตทั้งหมดและเครื่องหมาย + เป็นศูนย์ จะมีการแสดงที่ไม่ใช่ศูนย์ที่เป็นไปได้อีกหนึ่งรายการโดยตั้งค่าบิตเครื่องหมายเป็น 1

นี่เป็นวิธีที่ยืดยาวมากในการบอกว่าส่วนประกอบของ 2 แสดงถึงค่าในช่วง - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1)

จริง ๆ แล้วส่วนประกอบ 1 มีข้อได้เปรียบเหนือส่วนประกอบ 2 ถ้าคุณทำการคำนวณสัญญาณดิจิตอลจำนวนเต็ม การดำเนินการที่สมบูรณ์ของ 1 จะตัดเหลือศูนย์ 2 ส่วนเติมเต็มไปทาง -infinity ฉันเรียนรู้วิธีนี้อย่างหนัก ...

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