Saya hanya ingin tahu apakah ada alasan mengapa untuk mewakili -1 dalam biner, komplemen dua digunakan: membalik bit dan menambahkan 1?
-1 diwakili oleh 11111111 (komplemen dua) daripada (bagi saya lebih intuitif) 10000001 yang merupakan biner 1 dengan bit pertama sebagai bendera negatif.
Penafian: Saya tidak mengandalkan aritmatika biner untuk pekerjaan saya!
Jawaban:
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
dan1001
, masing-masing (saya berpegang pada 4 bit untuk ukuran). Dengan cara melengkapi keduanya, mereka adalah0010
dan1111
. 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:
0001
adalah 1, yang merupakan hasil yang diharapkan dari "2 + (- 1)".Namun dalam metode "intuitif" Anda, menambahkan lebih rumit:
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:
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:
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:
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.
sumber
how we arrived at 2s compliment the first place.
cs.cornell.edu/~tomf/notes/cps104/twoscomp.html1
menunjukkan-8
, dan tiga sisanya1
s menunjukkan4
,2
, dan1
, masing-masing, sehingga-8+4+2+1 = -1
.Wikipedia mengatakan semuanya:
Dengan kata lain, menambahkan adalah sama, apakah angka tersebut negatif.
sumber
Meskipun pertanyaan ini sudah tua, izinkan saya memasukkan 2 sen saya.
Sebelum saya jelaskan ini, mari kita kembali ke dasar. Komplemen 2 'adalah komplemen 1 + 1. Sekarang apa komplemen 1 dan apa signifikansnya sebagai tambahan.
Jumlah angka n-bit dan komplemen 1-nya memberi Anda angka tertinggi yang dapat diwakili oleh n-bit tersebut. Contoh:
Sekarang apa yang akan terjadi jika kami mencoba menambahkan 1 lagi ke hasilnya. Ini akan menghasilkan luapan.
Hasilnya
1 0000
adalah 0 (karena kami bekerja dengan angka 4 bit, (angka 1 di sebelah kiri adalah overflow)Jadi,
Seseorang kemudian memutuskan untuk memanggil komplemen 1 + 1 sebagai komplemen 2'. Jadi pernyataan di atas menjadi: Setiap angka n'bit + komplemen 2nya = 0 yang berarti komplemen 2 dari angka = - (dari nomor itu)
Semua ini menghasilkan satu pertanyaan lagi, mengapa kita hanya menggunakan (n-1) dari n bit untuk mewakili angka positif dan mengapa bit paling kiri mewakili tanda (0 pada bit paling kiri berarti + ve number, dan 1 berarti -ve number). misal, mengapa kita hanya menggunakan 31 bit pertama dari sebuah int di java untuk mewakili angka positif jika bit ke-32 adalah 1, angka a -ve.
1 0000 (hasilnya nol, dengan carry 1 meluap)
Dengan demikian sistem (n + 2'complement n) = 0, masih berfungsi. Satu-satunya ambiguitas di sini adalah komplemen 2 dari 12 adalah 0100 yang secara ambigu juga mewakili +8, selain mewakili -12 dalam sistem komplemen 2s.
Masalah ini akan diselesaikan jika angka positif selalu memiliki 0 di bit paling kiri mereka. Dalam hal itu komplemen 2 mereka akan selalu memiliki 1 di bit paling kiri mereka, dan kami tidak akan memiliki ambiguitas dari set bit yang sama yang mewakili nomor komplemen 2 serta nomor + ve.
sumber
Pelengkap dua memungkinkan penambahan dan pengurangan dilakukan dengan cara normal (seperti Anda menggunakan angka yang tidak ditandai). Ini juga mencegah -0 (cara terpisah untuk mewakili 0 yang tidak akan sama dengan 0 dengan metode bit-by-bit normal untuk membandingkan angka).
sumber
ini untuk menyederhanakan jumlah dan perbedaan angka. jumlah angka negatif dan positif yang dikodifikasikan dalam komplemen 2 sama dengan menjumlahkannya dengan cara normal.
sumber
Implementasi operasi yang biasa adalah "flip the bits dan add 1", tetapi ada cara lain untuk mendefinisikannya yang mungkin membuat pemikiran lebih jelas. Komplemen 2 adalah bentuk yang Anda dapatkan jika Anda mengambil representasi tanpa tanda yang biasa di mana setiap bit mengontrol kekuatan 2 berikutnya, dan hanya membuat istilah negatif yang paling signifikan.
Mengambil nilai 8-bit 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0
Interpretasi biner unsigned yang biasa adalah:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
Interpretasi pelengkap keduanya adalah:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
Tidak ada bit lain yang berubah arti sama sekali, dan membawa ke 7 adalah "overflow" dan tidak diharapkan bekerja, sehingga hampir semua operasi aritmatika bekerja tanpa modifikasi (seperti yang telah dicatat orang lain). Sign-magnitude umumnya memeriksa bit tanda dan menggunakan logika yang berbeda.
sumber
Pelengkap dua memungkinkan angka negatif dan positif ditambahkan bersama tanpa logika khusus.
Jika Anda mencoba menambahkan 1 dan -1 menggunakan metode Anda
10000001 (-1)
+00000001 (1)
Anda mendapatkan
10000010 (-2)
Sebagai gantinya, dengan menggunakan komplemen dua, kita dapat menambahkan
11111111 (-1)
+00000001 (1) Anda mendapatkan
00000000 (0)
Hal yang sama berlaku untuk pengurangan.
Juga, jika Anda mencoba untuk mengurangi 4 dari 6 (dua angka positif) Anda dapat 2 melengkapi 4 dan menambahkan keduanya bersamaan 6 + (-4) = 6 - 4 = 2
Ini berarti bahwa pengurangan dan penambahan angka positif dan negatif semuanya dapat dilakukan oleh sirkuit yang sama dalam cpu.
sumber
Untuk memperluas jawaban orang lain:
Dalam pelengkap dua
Pembagian memang membutuhkan mekanisme yang berbeda.
Semua ini benar karena komplemen dua hanya aritmatika modular normal, di mana kita memilih untuk melihat beberapa angka sebagai negatif dengan mengurangi modulo.
sumber
unsigned mul(unsigned short x, unsigned short y) { return x*y; }
[16-bit pendek; 32-bit int] kadang-kadang akan menghasilkan kode yang tidak berfungsi jika produk lebih besar dari 2147483647.Membaca jawaban atas pertanyaan ini, saya menemukan komentar ini [diedit].
Menurut pendapat saya, pertanyaan yang diajukan dalam komentar ini cukup menarik dan jadi saya ingin pertama-tama untuk mengulanginya dan kemudian memberikan jawaban dan contoh.
PERTANYAAN - Bagaimana sistem dapat menetapkan bagaimana satu atau lebih byte yang berdekatan harus ditafsirkan? Secara khusus, bagaimana sistem dapat menetapkan apakah urutan byte yang diberikan adalah angka biner biasa atau angka pelengkap 2?
JAWABAN - Sistem menetapkan bagaimana menafsirkan urutan byte melalui tipe. Jenis mendefinisikan
CONTOH - Di bawah ini kita menganggap itu
char
Panjangnya 1 byteshort
Panjangnya 2 byteint
Panjangnya danfloat
adalah 4 byteHarap dicatat bahwa ukuran ini khusus untuk sistem saya. Walaupun cukup umum, mereka dapat berbeda dari sistem ke sistem. Jika Anda penasaran dengan apa yang ada di sistem Anda, gunakan operator sizeof .
Pertama-tama kita mendefinisikan sebuah array yang berisi 4 byte dan menginisialisasi semuanya ke angka biner
10111101
, sesuai dengan angka heksadesimalBD
.Kemudian kami membaca konten array menggunakan berbagai jenis.
unsigned char
dansigned char
unsigned short
danshort
unsigned int
,int
danfloat
4 byte dalam RAM (
l_Just4Bytes[ 0..3 ]
) selalu tetap sama persis. Satu-satunya hal yang berubah adalah bagaimana kita menafsirkannya.Sekali lagi, kami memberi tahu sistem cara menafsirkannya melalui tipe .
Sebagai contoh, di atas kami telah menggunakan tipe berikut untuk menafsirkan isi
l_Just4Bytes
arrayunsigned char
: 1 byte dalam biner biasasigned char
: 1 byte dalam komplemen 2'sunsigned short
: 2 byte dalam notasi biner biasashort
: 2 byte dalam komplemen 2 iniunsigned int
: 4 byte dalam notasi biner biasaint
: 4 byte dalam komplemen 2 inifloat
: 4 byte di notasi presisi tunggal IEEE 754[EDIT] Posting ini telah diedit setelah komentar oleh user4581301. Terima kasih telah meluangkan waktu untuk membuang beberapa baris yang bermanfaat itu!
sumber
int x = -4
, dan saya kemudian melakukanprintf("%d" , x)
bagaimana itu ditafsirkan? Juga apa perbedaan antaraunsigned int
dansigned int
dan%d
dan%u
... ini telah menggangguku untuk waktu yang lama sekarang .Terima kasih.int
tipe,signed
pengubah adalah default. Ini berarti bahwaint
dansigned int
persis jenis yang sama. Dengan demikian kedua definisi tersebutint i = -4;
dansigned int i = -4;
memiliki makna yang sama.int
adalah 4 byte dalam komplemen 2 danunsigned int
4 byte dalam notasi biner biasa (periksa ukuran tipe aktual pada sistem Anda menggunakansizeof
operator).Anda dapat menyaksikan Profesor Jerry Cain dari Stanford menjelaskan komplemen keduanya, pada kuliah kedua (penjelasan mengenai komplemen 2 dimulai sekitar pukul 13:00) dalam serangkaian kuliah yang disebut Paradigma Pemrograman yang tersedia untuk ditonton dari saluran YouTube Standford. Berikut tautan ke seri kuliah: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .
sumber
Pelengkap dua digunakan karena lebih mudah diterapkan dalam sirkuit dan juga tidak memungkinkan nol negatif.
Jika ada x bit, komplemen dua akan berkisar dari + (2 ^ x / 2 + 1) hingga - (2 ^ x / 2). Komplemen seseorang akan berjalan dari + (2 ^ x / 2) ke - (2 ^ x / 2), tetapi akan mengizinkan nol negatif (0000 sama dengan 1000 dalam sistem komplemen 4 bit 1).
sumber
Maksud Anda bukan untuk membalikkan semua bit dari angka biner Anda. Ini sebenarnya untuk mengurangi setiap digit dari 1. Hanya kebetulan kebetulan bahwa mengurangi 1 dari 1 menghasilkan 0 dan mengurangi 0 dari 1 menghasilkan 1. Jadi, membalik bit secara efektif melakukan pengurangan ini.
Tetapi mengapa Anda menemukan perbedaan setiap digit dari 1? Yah, kamu tidak. Maksud sebenarnya Anda adalah untuk menghitung selisih angka biner yang diberikan dari angka biner lain yang memiliki jumlah digit yang sama tetapi hanya berisi 1 itu. Misalnya jika nomor Anda adalah 10110001, ketika Anda membalik semua bit itu, Anda secara efektif menghitung (11111111 - 10110001).
Ini menjelaskan langkah pertama dalam perhitungan Komplemen Dua. Sekarang mari kita sertakan langkah kedua - menambahkan 1 - juga dalam gambar.
Tambahkan 1 ke persamaan biner di atas:
11111111 - 10110001 +1
Mendapatkan apa? Ini:
100000000 - 10110001
Ini adalah persamaan terakhir. Dan dengan melakukan dua langkah itu Anda mencoba untuk menemukan ini, perbedaan terakhir: angka biner dikurangi dari angka biner lainnya dengan satu digit tambahan dan mengandung nol kecuali pada posisi bit paling signifikan.
Tapi mengapa kita tidak menyukai perbedaan ini? Nah, mulai sekarang, saya kira akan lebih baik jika Anda membaca artikel Wikipedia .
sumber
Kami hanya melakukan operasi penjumlahan untuk penjumlahan dan pengurangan. Kami menambahkan operan kedua ke operan pertama sebagai tambahan. Untuk pengurangan kita tambahkan komplemen 2 dari operan kedua ke operan pertama.
Dengan representasi pelengkap 2, kita tidak perlu komponen digital yang terpisah untuk pengurangan — hanya penambah dan pelengkap yang digunakan.
sumber
Penting untuk dicatat bahwa pada beberapa mesin penambahan awal, sebelum zaman komputer digital, pengurangan akan dilakukan dengan meminta operator memasukkan nilai menggunakan kumpulan legenda warna yang berbeda pada setiap tombol (sehingga setiap tombol akan memasukkan sembilan dikurangi jumlah yang akan dikurangi), dan tekan tombol khusus akan menganggap membawa ke dalam perhitungan. Jadi, pada mesin enam digit, untuk mengurangi 1234 dari suatu nilai, operator akan menekan tombol yang biasanya menunjukkan "998.765" dan menekan tombol untuk menambahkan nilai itu ditambah satu ke kalkulasi yang sedang berlangsung. Aritmatika komplemen dua adalah sederajat biner dari aritmatika "komplemen sepuluh" sebelumnya.
sumber
Keuntungan melakukan pengurangan dengan metode komplemen adalah pengurangan
kompleksitas perangkat keras. Tidak perlu sirkuit digital yang berbeda untuk penambahan dan pengurangan. Kedua penambahan dan pengurangan dilakukan oleh penambah saja.
sumber
Keuntungan utama dari representasi komplemen dua yang belum disebutkan di sini adalah bahwa bit yang lebih rendah dari jumlah komplemen dua, perbedaan, atau produk hanya bergantung pada bit yang sesuai dari operan. Alasan bahwa nilai 8 bit yang ditandatangani untuk -1
11111111
adalah karena mengurangkan bilangan bulat mana pun yang memiliki 8 bit terendah00000001
dari bilangan bulat lain yang 8 bit terendah0000000
akan menghasilkan bilangan bulat yang 8 bit terendahnya adalah11111111
. Secara matematis, nilai -1 akan menjadi string tak terhingga dari 1's, tetapi semua nilai dalam kisaran tipe integer tertentu akan menjadi semua 1 atau 0 melewati titik tertentu, sehingga lebih nyaman bagi komputer untuk "memperpanjang" bit paling signifikan dari angka seolah-olah itu mewakili angka tak terbatas dari 1 atau 0.Two's-melengkapi hanya tentang satu-satunya representasi angka yang ditandatangani yang bekerja dengan baik ketika berhadapan dengan tipe yang lebih besar dari ukuran kata alami mesin biner, karena ketika melakukan penambahan atau pengurangan, kode dapat mengambil potongan terendah dari setiap operan, menghitung bagian terendah dari hasilnya, dan simpan itu, kemudian muat potongan berikutnya dari setiap operan, hitung potongan berikutnya dari hasil, dan simpan itu, dll. Dengan demikian, bahkan sebuah prosesor yang membutuhkan semua penambahan dan pengurangan untuk melalui register 8-bit tunggal dapat menangani nomor yang ditandatangani 32-bit secara efisien (lebih lambat dibandingkan dengan register 32-bit, tentu saja, tetapi masih bisa diterapkan).
Ketika menggunakan representasi bertanda tangan lain yang diizinkan oleh Standar C, setiap bit dari hasil berpotensi dipengaruhi oleh bit dari operan, sehingga diperlukan untuk memegang seluruh nilai dalam register sekaligus atau mengikuti perhitungan dengan tambahan langkah yang akan, setidaknya dalam beberapa kasus, memerlukan membaca, memodifikasi, dan menulis ulang setiap potongan hasilnya.
sumber
Ada berbagai jenis representasi yaitu:
Representasi angka yang tidak digunakan yang digunakan untuk hanya mewakili angka positif
Representasi nomor -Signed digunakan untuk mewakili angka positif maupun negatif. Dalam representasi nomor yang ditandatangani, MSB bit mewakili bit tanda dan bit sisanya mewakili angka. Ketika MSB adalah 0 berarti angka positif dan Ketika MSB adalah 1 berarti angka negatif.
Masalah dengan representasi nomor yang ditandatangani adalah bahwa ada dua nilai untuk 0.
Masalah dengan representasi komplemen seseorang adalah bahwa ada dua nilai untuk 0.
Tetapi jika kita menggunakan representasi komplemen Dua maka hanya akan ada satu nilai untuk 0 itu sebabnya kami mewakili angka negatif dalam bentuk komplemen dua.
Sumber: Mengapa angka negatif disimpan dalam bentuk komplemen bytesofgigabytes dua
sumber
Satu jawaban yang memuaskan mengapa Komplemen Two2 digunakan untuk mewakili angka negatif daripada sistem Komplemen One adalah bahwa sistem Komplemen Two's menyelesaikan masalah beberapa representasi 0 dan kebutuhan end-around-carry yang ada dalam sistem komplemen One untuk mewakili negatif angka.
Untuk informasi lebih lanjut Kunjungi https://en.wikipedia.org/wiki/Signed_number_representations
Untuk End-around-carry Kunjungi https://en.wikipedia.org/wiki/End-around_carry
sumber