Ini dilakukan sehingga penambahan tidak perlu memiliki logika khusus untuk berurusan dengan angka negatif. Lihat artikel di Wikipedia .
Katakanlah Anda memiliki dua angka, 2 dan -1. Dengan cara "intuitif" Anda dalam merepresentasikan angka, angka-angka itu akan menjadi 0010
dan 1001
, masing-masing (saya berpegang pada 4 bit untuk ukuran). Dengan cara melengkapi keduanya, mereka adalah 0010
dan 1111
. Sekarang, katakanlah saya ingin menambahkannya.
Tambahan pelengkap dua sangat sederhana. Anda menambahkan nomor secara normal dan bit carry apa pun pada akhirnya dibuang. Jadi mereka ditambahkan sebagai berikut:
0010
+ 1111
=10001
= 0001 (discard the carry)
0001
adalah 1, yang merupakan hasil yang diharapkan dari "2 + (- 1)".
Namun dalam metode "intuitif" Anda, menambahkan lebih rumit:
0010
+ 1001
= 1011
Yang -3, kan? Penambahan sederhana tidak berfungsi dalam kasus ini. Anda perlu mencatat bahwa salah satu angka negatif dan menggunakan algoritma yang berbeda jika itu masalahnya.
Untuk metode penyimpanan "intuitif" ini, pengurangan adalah operasi yang berbeda dari penambahan, membutuhkan pemeriksaan tambahan pada angka-angka sebelum dapat ditambahkan. Karena Anda ingin operasi paling dasar (penambahan, pengurangan, dll) secepat mungkin, Anda perlu menyimpan angka dengan cara yang memungkinkan Anda menggunakan algoritma paling sederhana yang mungkin.
Selain itu, dalam metode penyimpanan "intuitif", ada dua nol:
0000 "zero"
1000 "negative zero"
Secara intuitif jumlahnya sama tetapi memiliki dua nilai berbeda saat disimpan. Setiap aplikasi perlu mengambil langkah ekstra untuk memastikan bahwa nilai bukan nol juga bukan nol negatif.
Ada bonus lain dengan menyimpan ints dengan cara ini, dan saat itulah Anda perlu memperluas lebar register, nilai tersebut disimpan. Dengan komplemen dua, menyimpan nomor 4-bit dalam register 8-bit adalah masalah pengulangan bit paling signifikan:
0001 (one, in four bits)
00000001 (one, in eight bits)
1110 (negative two, in four bits)
11111110 (negative two, in eight bits)
Ini hanya masalah melihat sedikit tanda dari kata yang lebih kecil dan mengulanginya sampai itu memenuhi lebar kata yang lebih besar.
Dengan metode Anda, Anda perlu menghapus bit yang ada, yang merupakan operasi tambahan selain padding:
0001 (one, in four bits)
00000001 (one, in eight bits)
1010 (negative two, in four bits)
10000010 (negative two, in eight bits)
Anda masih perlu mengatur 4 bit tambahan dalam kedua kasus, tetapi dalam kasus "intuitif" Anda harus menghapus bit 5 juga. Ini adalah satu langkah ekstra kecil di salah satu operasi paling mendasar dan umum yang ada di setiap aplikasi.