การมีภูมิหลังทางคณิตศาสตร์ที่บริสุทธิ์นี่เป็นวิธีการทางคณิตศาสตร์ที่มากกว่าสำหรับผู้ที่สนใจ
ถ้าเราเริ่มด้วยจำนวนเต็ม 8 บิตที่ลงนามและไม่ได้ลงนามสิ่งที่เรามีก็คือจำนวนเต็ม modulo 256 เท่าที่มีการเพิ่มและการคูณให้คำนึงถึงการเติมเต็มของ 2 จะใช้แทนจำนวนเต็มลบ .
สิ่งที่แตกต่างกันอยู่ในสองแห่ง: หนึ่งคือการดำเนินการเปรียบเทียบ เรียกอีกอย่างหนึ่งว่าจำนวนเต็มโมดูโล 256 นั้นถือว่าเป็นวงกลมของตัวเลขที่ดีที่สุด (เช่นจำนวนเต็มโมดูโล 12 ทำบนหน้าปัดแบบอะนาล็อกแบบเก่า) ในการทำการเปรียบเทียบเชิงตัวเลข (คือ x <y) มีความหมายเราจำเป็นต้องตัดสินใจว่าตัวเลขใดมีค่าน้อยกว่าตัวเลขอื่น จากมุมมองของนักคณิตศาสตร์เราต้องการฝังจำนวนเต็มโมดูโล 256 ลงในชุดของจำนวนเต็มทั้งหมดอย่างใด การทำแผนที่จำนวนเต็ม 8 บิตซึ่งการเป็นตัวแทนไบนารีคือศูนย์ทั้งหมดถึงจำนวนเต็ม 0 เป็นสิ่งที่ชัดเจนที่จะทำ จากนั้นเราสามารถดำเนินการแมปอื่น ๆ เพื่อให้ '0 + 1' (ผลลัพธ์ของการ zeroing register บอกว่า ax และการเพิ่มขึ้นทีละหนึ่งโดยใช้ 'inc ax') จะไปที่จำนวนเต็ม 1 เป็นต้น เราสามารถทำเช่นเดียวกันกับ -1 เช่นการแมป '0-1' กับจำนวนเต็ม -1 และ '0-1-1' เป็นจำนวนเต็ม -2 เราต้องมั่นใจว่าการฝังนี้เป็นฟังก์ชั่นดังนั้นจึงไม่สามารถแมปจำนวนเต็ม 8 บิตเดียวกับจำนวนเต็มสองตัว เช่นนี้หมายความว่าถ้าเราแมปตัวเลขทั้งหมดเข้าไปในชุดจำนวนเต็ม 0 จะอยู่ที่นั่นพร้อมกับจำนวนเต็มน้อยกว่า 0 และบางส่วนมากกว่า 0 มี 255 วิธีหลักในการทำสิ่งนี้ด้วยจำนวนเต็ม 8 บิต (ตาม เป็นค่าต่ำสุดที่คุณต้องการตั้งแต่ 0 ถึง -255) จากนั้นคุณสามารถกำหนด 'x <y' ในรูปของ '0 <y - x'
มีสองกรณีการใช้งานทั่วไปซึ่งการสนับสนุนฮาร์ดแวร์มีความหมาย: หนึ่งที่มีจำนวนเต็มไม่ใช่ศูนย์ทั้งหมดมากกว่า 0 และเป็นหนึ่งที่มีประมาณ 50/50 แยกประมาณ 0 ความเป็นไปได้อื่น ๆ ทั้งหมดจะเลียนแบบได้อย่างง่ายดายโดยการเพิ่มตัวเลขพิเศษ และย่อย 'ก่อนการดำเนินการและความต้องการสิ่งนี้หาได้ยากกว่าที่ฉันไม่สามารถนึกถึงตัวอย่างที่ชัดเจนในซอฟต์แวร์สมัยใหม่ (เนื่องจากคุณสามารถทำงานกับ mantissa ขนาดใหญ่กว่าพูดได้ 16 บิต)
อีกประเด็นคือการแม็พจำนวนเต็ม 8 บิตลงในช่องว่างของจำนวนเต็ม 16 บิต -1 ไปที่ -1 หรือไม่ นี่คือสิ่งที่คุณต้องการหาก 0xFF หมายถึงการแสดง -1 ในกรณีนี้การขยายสัญญาณคือสิ่งที่สมเหตุสมผลที่ต้องทำดังนั้น 0xFF จะไปที่ 0xFFFF ในทางตรงกันข้ามถ้า 0xFF หมายถึงการแสดง 255 แล้วคุณต้องการให้แมปเป็น 255 ดังนั้น 0x00FF แทนที่จะเป็น 0xFFFF
นี่คือความแตกต่างระหว่างการดำเนินการ 'shift' และ 'arithmetic shift' เช่นกัน
ในท้ายที่สุดมันลงมาจากความจริงที่ว่า int ในซอฟแวร์ไม่ใช่จำนวนเต็ม แต่การแทนในหน่วยไบนารี่และมีเพียงบางส่วนเท่านั้นที่สามารถแสดงได้ เมื่อออกแบบฮาร์ดแวร์จะต้องมีตัวเลือกต่าง ๆ เพื่อใช้ในการสร้างฮาร์ดแวร์ เนื่องจากการเติมเต็มของ 2 เป็นการเติมและการดำเนินการคูณเหมือนกันมันจึงเหมาะสมที่จะแสดงจำนวนเต็มลบด้วยวิธีนี้ จากนั้นก็เป็นเพียงเรื่องของการดำเนินการซึ่งขึ้นอยู่กับจำนวนเต็มที่คุณต้องการเป็นตัวแทนไบนารี