Memiliki latar belakang matematika murni, ini sedikit lebih matematis bagi siapa pun yang tertarik.
Jika kita mulai dengan bilangan bulat 8bit yang ditandatangani dan tidak ditandatangani, yang kita miliki pada dasarnya adalah bilangan bulat modulo 256, sejauh menyangkut penambahan dan perkalian, asalkan komplemen 2's digunakan untuk mewakili bilangan bulat negatif (dan ini adalah bagaimana setiap prosesor modern melakukannya) .
Di mana ada perbedaan di dua tempat: satu adalah operasi perbandingan. Dalam arti tertentu, bilangan bulat modulo 256 paling baik dianggap sebagai lingkaran angka (seperti bilangan bulat modulo 12 lakukan pada clockface analog kuno). Untuk membuat perbandingan numerik (adalah x <y) bermakna, kita perlu memutuskan angka mana yang lebih sedikit dari yang lain. Dari sudut pandang ahli matematika, kami ingin menanamkan bilangan bulat modulo 256 ke dalam himpunan semua bilangan bulat entah bagaimana. Memetakan bilangan bulat 8bit yang representasi binernya nol untuk bilangan bulat 0 adalah hal yang jelas untuk dilakukan. Kita kemudian dapat melanjutkan untuk memetakan orang lain sehingga '0 +1' (hasil dari nolkan register, katakanlah kapak, dan kenaikan itu satu, melalui 'inc kapak') pergi ke bilangan bulat 1, dan seterusnya. Kita dapat melakukan hal yang sama dengan -1, misalnya memetakan '0-1' ke integer -1, dan '0-1-1' ke bilangan bulat -2. Kami harus memastikan bahwa penyematan ini adalah fungsi, jadi tidak dapat memetakan bilangan bulat 8bit tunggal ke dua bilangan bulat. Dengan demikian, ini berarti bahwa jika kita memetakan semua angka ke dalam himpunan bilangan bulat, 0 akan ada di sana, bersama dengan beberapa bilangan bulat kurang dari 0 dan beberapa lebih dari 0. Pada dasarnya ada 255 cara untuk melakukan ini dengan bilangan bulat 8bit (menurut hingga minimum yang Anda inginkan, dari 0 hingga -255). Kemudian Anda dapat mendefinisikan 'x <y' dalam hal '0 <y - x'.
Ada dua kasus penggunaan umum, di mana dukungan perangkat keras masuk akal: satu dengan semua bilangan nol bukan yang lebih besar dari 0, dan satu dengan sekitar 50/50 membagi sekitar 0. Semua kemungkinan lain mudah ditiru dengan menerjemahkan angka melalui penambahan tambahan. dan sebelum operasi, dan kebutuhan untuk ini sangat langka daripada saya tidak bisa memikirkan contoh eksplisit dalam perangkat lunak modern (karena Anda hanya dapat bekerja dengan mantissa yang lebih besar, katakanlah 16 bit).
Masalah lainnya adalah memetakan bilangan bulat 8bit ke dalam ruang bilangan bulat 16bit. Apakah -1 menuju ke -1? Ini yang Anda inginkan jika 0xFF dimaksudkan untuk mewakili -1. Dalam hal ini, perpanjangan tanda adalah hal yang masuk akal untuk dilakukan, sehingga 0xFF masuk ke 0xFFFF. Di sisi lain, jika 0xFF dimaksudkan untuk mewakili 255, maka Anda ingin memetakannya ke 255, maka ke 0x00FF, bukan 0xFFFF.
Ini adalah perbedaan antara operasi 'shift' dan 'shift aritmatika' juga.
Pada akhirnya, bagaimanapun, itu datang ke fakta bahwa int dalam perangkat lunak bukan bilangan bulat, tetapi representasi dalam biner, dan hanya beberapa yang dapat diwakili. Saat mendesain perangkat keras, harus dibuat pilihan untuk melakukan apa secara native pada perangkat keras. Karena dengan komplemen 2's, operasi penjumlahan dan multiplikasi identik, masuk akal untuk mewakili bilangan bulat negatif dengan cara ini. Maka itu hanya masalah operasi yang bergantung pada bilangan bulat mana representasi biner Anda dimaksudkan untuk diwakili.