Apa itu "Komplemen 2"?

434

Saya mengikuti kursus sistem komputer dan telah berjuang , sebagian, dengan Two's Complement . Saya ingin memahaminya tetapi semua yang saya baca belum menyatukan gambar untuk saya. Saya telah membaca artikel wikipedia dan berbagai artikel lainnya, termasuk buku teks saya .

Oleh karena itu, saya ingin memulai posting wiki komunitas ini untuk menentukan apa itu Two's Complement, bagaimana menggunakannya dan bagaimana hal itu dapat mempengaruhi angka selama operasi seperti gips (dari yang ditandatangani menjadi unsigned dan sebaliknya), operasi bit-wise dan operasi bit-shift .

Apa yang saya harapkan adalah definisi yang jelas dan ringkas yang mudah dipahami oleh seorang programmer.

Frank V
sumber

Jawaban:

628

Pelengkap dua adalah cara cerdas menyimpan bilangan bulat sehingga masalah matematika umum sangat mudah diimplementasikan.

Untuk memahami, Anda harus memikirkan angka-angka dalam biner.

Pada dasarnya dikatakan,

  • untuk nol, gunakan semua 0.
  • untuk bilangan bulat positif, mulailah menghitung, dengan maksimum 2 (jumlah bit - 1) -1.
  • untuk bilangan bulat negatif, lakukan hal yang persis sama, tetapi alihkan peran 0 dan 1 (jadi alih-alih mulai dengan 0000, mulailah dengan 1111 - itulah bagian "pelengkap").

Mari kita coba dengan mini-byte 4 bit (kami akan menyebutnya nibble - 1/2 a byte).

  • 0000 - nol
  • 0001 - satu
  • 0010 - dua
  • 0011 - tiga
  • 0100ke 0111- empat hingga tujuh

Sejauh yang kami bisa dalam positif. 2 3 -1 = 7.

Untuk yang negatif:

  • 1111 - yang negatif
  • 1110 - negatif dua
  • 1101 - negatif tiga
  • 1100ke 1000- negatif empat ke negatif delapan

Perhatikan bahwa Anda mendapatkan satu nilai ekstra untuk negatif ( 1000= -8) yang tidak Anda dapatkan untuk positif. Ini karena 0000digunakan untuk nol. Ini dapat dianggap sebagai Line Number komputer.

Membedakan antara angka positif dan negatif

Melakukan ini, bit pertama mengambil peran bit "tanda", karena dapat digunakan untuk membedakan antara nilai desimal negatif dan negatif. Jika bit yang paling signifikan adalah 1, maka biner dapat dikatakan negatif, di mana seolah-olah bit yang paling signifikan (paling kiri) adalah 0, Anda dapat mengatakan bahwa nilai desimalnya tidak negatif.

Angka negatif "Satu komplemen" hanya membalik bit tanda, kemudian dihitung dari 0. Tetapi pendekatan ini harus berurusan dengan menafsirkan 1000sebagai "nol negatif" yang membingungkan. Anda umumnya hanya perlu khawatir tentang ini ketika bekerja dekat dengan perangkat keras.

lavinio
sumber
148
Mungkin bagian terbaik dari komplemen dua adalah bagaimana menyederhanakan matematika. Coba tambahkan 2 (0010) dan -2 (1110) bersama-sama dan Anda mendapatkan 10.000. Bit yang paling signifikan adalah melimpah, sehingga hasilnya benar-benar 0000. Hampir seperti sihir, 2 + -2 = 0.
Naaff
96
Keuntungan lain selain penambahan dan pengurangan mudah adalah bahwa komplemen 2s hanya memiliki nol. Jika Anda menggunakan bit tanda sederhana, katakanlah menggunakan 0001 untuk mewakili +1 dan 1001 untuk mewakili -1, Anda akan memiliki dua nol: 0000 ("+0") dan 1000 ("-0"). Sungguh menyakitkan di belakang.
Jörg W Mittag
26
Suara positif untuk itu menjadi to the point dan juga untuk menjelaskan mengapa nilai negatif memiliki rentang yang lebih besar yang positif. Saya datang mencari alasan perbedaan jangkauan.
Ashwin
2
Tidakkah seharusnya Anda mengatakan "untuk bilangan bulat negatif, lakukan hal yang persis sama tetapi hitung mundur dan alihkan peran 0 dan 1"
Koray Tugay
1
Luar biasa. Menambahkan bagian tambahan dari konversi bit ke integer negatif.
Suraj Jain
340

Saya ingin tahu apakah ini bisa dijelaskan lebih baik daripada artikel Wikipedia.

Masalah dasar yang Anda coba selesaikan dengan representasi komplemen dua adalah masalah menyimpan bilangan bulat negatif.

Pertama-tama pertimbangkan integer tanpa tanda yang disimpan dalam 4 bit. Anda dapat memiliki yang berikut ini

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Ini tidak ditandatangani karena tidak ada indikasi apakah itu negatif atau positif.

Masuk Magnitude dan Notasi Kelebihan

Untuk menyimpan angka negatif, Anda dapat mencoba beberapa hal. Pertama, Anda dapat menggunakan notasi tanda magnitudo yang memberikan bit pertama sebagai bit tanda untuk mewakili +/- dan bit sisanya untuk mewakili magnitudo. Jadi gunakan 4 bit lagi dan anggap 1 berarti - dan 0 berarti + maka Anda miliki

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Jadi, Anda lihat masalahnya di sana? Kami memiliki positif dan negatif 0. Masalah yang lebih besar adalah menambah dan mengurangi angka biner. Sirkuit untuk menambah dan mengurangi menggunakan tanda magnitudo akan sangat kompleks.

apa yang

0010
1001 +
----

?

Sistem lain adalah notasi berlebih . Anda dapat menyimpan angka negatif, Anda menyingkirkan masalah dua nol tetapi penambahan dan pengurangan tetap sulit.

Jadi datanglah pelengkap dua. Sekarang Anda dapat menyimpan bilangan bulat positif dan negatif dan melakukan aritmatika dengan relatif mudah. Ada sejumlah metode untuk mengubah angka menjadi komplemen dua. Ini dia.

Konversi Desimal ke Dua's Komplemen

  1. Ubah angka menjadi biner (abaikan tandanya untuk sekarang) misal 5 adalah 0101 dan -5 adalah 0101

  2. Jika angka tersebut adalah angka positif maka Anda selesai. misalnya 5 adalah 0101 dalam biner menggunakan notasi komplemen dua.

  3. Jika angkanya negatif maka

    3.1 menemukan komplemen (terbalik 0 dan 1) misalnya -5 adalah 0101 sehingga menemukan komplemen adalah 1010

    3,2 Tambahkan 1 ke komplemen 1010 + 1 = 1011. Oleh karena itu, -5 dalam komplemen dua adalah 1011.

Jadi, bagaimana jika Anda ingin melakukan 2 + (-3) dalam biner? 2 + (-3) adalah -1. Apa yang harus Anda lakukan jika Anda menggunakan besaran tanda untuk menambahkan angka-angka ini? 0010 + 1101 =?

Menggunakan komplemen dua mempertimbangkan betapa mudahnya.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Mengubah Komplemen Dua menjadi Desimal

Mengonversi 1111 ke desimal:

  1. Angka dimulai dengan 1, jadi negatif, jadi kami menemukan komplemen dari 1111, yaitu 0000.

  2. Tambahkan 1 hingga 0000, dan kami memperoleh 0001.

  3. Konversi 0001 ke desimal, yaitu 1.

  4. Terapkan tanda = -1.

Tada!

Vincent Ramdhanie
sumber
45
Jawaban terbaik menurut saya.
Koray Tugay
5
ya, ini cukup sederhana dan menjelaskan masalah ini dengan sangat baik
Max Koretskyi
3
Saya tidak mengerti bagaimana menambahkan satu ketika mengonversi kedua cara selalu mengarah ke nomor yang sama. Dalam pikiran saya, Anda akan membalikkan langkah-langkah, atau mengurangi satu atau sesuatu.
Marcos Pereira
2
Mengapa menambahkan 1 ke komplemen?
Zinan Xing
4
Jawaban ini harus digunakan di Wikipedia.
Hiroki
119

Seperti kebanyakan penjelasan yang pernah saya lihat, yang di atas jelas tentang cara bekerja dengan komplemen 2, tetapi tidak benar-benar menjelaskan apa yang secara matematis. Saya akan mencoba melakukan itu, setidaknya untuk bilangan bulat, dan saya akan membahas beberapa latar belakang yang mungkin sudah lazim.

Ingat cara kerjanya untuk desimal:
  2345
adalah cara penulisan
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

Dengan cara yang sama, biner adalah cara menulis angka menggunakan hanya 0 dan 1 mengikuti ide umum yang sama, tetapi mengganti 10s di atas dengan 2s. Kemudian dalam biner,
  1111
adalah cara penulisan
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
dan jika Anda berhasil, itu ternyata sama dengan 15 (basis 10). Itu karena itu
  8 + 4 + 2 + 1 = 15.

Ini semua baik dan bagus untuk angka positif. Ini bahkan berfungsi untuk angka negatif jika Anda bersedia menempelkan tanda minus di depannya, seperti halnya manusia dengan angka desimal. Itu bahkan bisa dilakukan di komputer, semacam, tapi saya belum melihat komputer seperti itu sejak awal tahun 1970-an. Saya akan meninggalkan alasan untuk diskusi yang berbeda.

Untuk komputer ternyata lebih efisien menggunakan representasi komplemen untuk angka negatif. Dan inilah sesuatu yang sering diabaikan. Notasi pelengkap melibatkan semacam pembalikan digit angka, bahkan nol tersirat yang datang sebelum angka positif normal. Itu aneh, karena muncul pertanyaan: semuanya? Itu bisa menjadi jumlah digit yang tak terbatas untuk dipertimbangkan.

Untungnya, komputer tidak mewakili ketidakterbatasan. Angka dibatasi pada panjang tertentu (atau lebar, jika Anda suka). Jadi mari kita kembali ke bilangan biner positif, tetapi dengan ukuran tertentu. Saya akan menggunakan 8 digit ("bit") untuk contoh-contoh ini. Jadi angka biner kita akan menjadi
  00001111
atau
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

Untuk membentuk komplemen negatif 2, pertama-tama kita melengkapi semua digit (biner) untuk membentuk
  11110000
dan menambahkan 1 ke bentuk
  11110001
tetapi bagaimana kita memahami bahwa artinya -15?

Jawabannya adalah kita mengubah arti bit orde tinggi (yang paling kiri). Bit ini akan menjadi 1 untuk semua angka negatif. Perubahannya adalah dengan mengubah tanda kontribusinya pada nilai nomor yang muncul. Jadi sekarang 11110001 kita dipahami mewakili
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Perhatikan bahwa "-" di depan ungkapan itu? Ini berarti bahwa bit tanda membawa bobot -2 7 , yaitu -128 (basis 10). Semua posisi lain mempertahankan bobot yang sama dengan yang mereka miliki dalam angka biner yang tidak ditandatangani.

Mengetahui -15 kami adalah
  -128 + 64 + 32 + 16 + 1
Cobalah di kalkulator Anda. ini -15.

Dari tiga cara utama yang saya lihat angka negatif terwakili di komputer, komplemen 2's menang dengan mudah untuk kenyamanan dalam penggunaan umum. Ini memiliki keanehan. Karena ini biner, harus ada beberapa kombinasi bit yang mungkin. Setiap angka positif dapat dipasangkan dengan negatifnya, tetapi hanya ada satu nol. Meniadakan nol membuat Anda nol. Jadi ada satu kombinasi lagi, angka dengan 1 di bit tanda dan 0 di tempat lain. Angka positif yang sesuai tidak akan sesuai dengan jumlah bit yang digunakan.

Yang lebih aneh dari angka ini adalah jika Anda mencoba membentuk positifnya dengan melengkapi dan menambahkannya, Anda akan mendapatkan angka negatif yang sama kembali. Tampaknya wajar bahwa nol akan melakukan ini, tetapi ini tidak terduga dan sama sekali bukan perilaku yang biasa kita lakukan karena komputer disamping, kita biasanya memikirkan persediaan angka yang tidak terbatas, bukan aritmatika dengan panjang tetap ini.

Ini seperti puncak gunung es keanehan. Masih ada lagi yang menunggu di bawah permukaan, tapi itu sudah cukup untuk diskusi ini. Anda mungkin dapat menemukan lebih banyak jika Anda meneliti "overflow" untuk aritmatika titik tetap. Jika Anda benar-benar ingin masuk ke dalamnya, Anda mungkin juga meneliti "modular arithmetic".

ForDummies
sumber
1
Saya suka jawaban ini! Menjelaskan bagaimana mengambil 2s melengkapi dan menambahkan satu berfungsi.
SJ.
Saya suka jawaban ini juga. Terutama di mana Anda menunjukkan bagaimana angka negatif itu digambarkan. Di sini saya pikir seluruh bilangan terbalik, bukan hanya MSB dan kemudian ditambahkan kembali nilai-nilai tertimbang lainnya. Terima kasih, ini memecahkan blok otak saya
user188757
Pekerjaan bagus menyebutkan nomor ganjil yang tidak memiliki kebalikan. Tetapi apa yang kita lakukan tentang ini? Apakah kita hanya mengatur flag overflow jika seseorang mencoba membaliknya?
NH.
Sementara jawaban lain fokus pada "bagaimana", jawaban ini menuntun kita dengan lembut dengan "mengapa". Itu membantu saya. Terima kasih!
Abhishek Pathak
Jika angka berakhir dengan 11000 ... 000, pembalikannya akan menghasilkan 01000 ... 000. Notasi komplemen dua didasarkan pada gagasan bahwa semua digit di sebelah kiri digit yang diwakili paling kiri harus memiliki nilai yang sama dengan digit itu, tetapi ketika membalikkan angka yang representasinya 1000 ... 000, itu tidak akan benar.
supercat
20

Pelengkap 2 sangat berguna untuk menemukan nilai biner, namun saya memikirkan cara yang jauh lebih ringkas untuk menyelesaikan masalah seperti itu (tidak pernah melihat orang lain menerbitkannya):

ambil biner, misalnya: 1101 yang [dengan asumsi ruang "1" adalah tanda] sama dengan -3 .

menggunakan komplemen 2's kita akan melakukan ini ... flip 1101 ke 0010 ... tambahkan 0001 + 0010 ===> memberi kita 0011. 0011 dalam biner positif = 3. karena itu 1101 = -3 !

Apa yang saya sadari:

alih-alih semua membalik dan menambahkan, Anda bisa melakukan metode dasar untuk menyelesaikan biner positif (katakanlah 0101) adalah (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Lakukan konsep yang sama persis dengan negatif! (Dengan sedikit twist)

ambil 1101, misalnya:

untuk angka pertama alih-alih 2 3 * 1 = 8 , do - (2 3 * 1) = -8 .

kemudian lanjutkan seperti biasa, melakukan -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3

Simon Yundov
sumber
1
Cara terbaik, saya bisa mengerti komplemen 2's. Setelah membaca ini, saya bisa mengerti semua jawaban untuk pertanyaan di atas.
Shakeel Shahzad
1
Ini adalah metode yang disebutkan dalam buku Sistem Komputer: Perspektif programmer.
jimo
1
Ini cara yang jauh lebih cepat!
chanzerre
14

Bayangkan Anda memiliki jumlah bit / trit / digit / apa pun yang terbatas. Anda mendefinisikan 0 karena semua angka adalah 0, dan menghitung secara alami:

00
01
02
..

Akhirnya Anda akan meluap.

98
99
00

Kami memiliki dua digit dan dapat mewakili semua angka dari 0 hingga 100. Semua angka itu positif! Misalkan kita ingin merepresentasikan angka negatif juga?

Apa yang sebenarnya kita miliki adalah sebuah siklus. Angka sebelum 2 adalah 1. Angka sebelum 1 adalah 0. Angka sebelum 0 adalah ... 99 .

Jadi, untuk kesederhanaan, katakanlah angka berapapun di atas 50 adalah negatif. "0" hingga "49" mewakili 0 hingga 49. "99" adalah -1, "98" adalah -2, ... "50" adalah -50.

Representasi ini adalah komplemen sepuluh . Komputer biasanya menggunakan komplemen dua , yang sama kecuali menggunakan bit, bukan digit.

Hal yang menyenangkan tentang komplemen sepuluh adalah penambahan itu hanya berfungsi . Anda tidak perlu melakukan sesuatu yang istimewa untuk menambahkan angka positif dan negatif!

Kapten Segfault
sumber
9

Saya membaca penjelasan fantastis tentang Reddit oleh jng, menggunakan odometer sebagai analogi.

masukkan deskripsi gambar di sini

Itu adalah konvensi yang bermanfaat. Sirkuit dan operasi logika yang sama yang menambah / mengurangi bilangan positif dalam biner masih bekerja pada bilangan positif dan negatif jika menggunakan konvensi, itu sebabnya ini sangat berguna dan ada di mana-mana.

Bayangkan odometer mobil, itu berputar di (katakanlah) 99999. Jika Anda menambah 00000 Anda mendapatkan 00001. Jika Anda mengurangi 00000, Anda mendapatkan 99999 (karena roll-sekitar). Jika Anda menambahkan satu kembali ke 99999, itu akan kembali ke 00000. Jadi, penting untuk memutuskan bahwa 99999 mewakili -1. Demikian juga, sangat berguna untuk memutuskan bahwa 99998 mewakili -2, dan seterusnya. Anda harus berhenti di suatu tempat, dan juga dengan konvensi, bagian atas angka dianggap negatif (50000-99999), dan bagian bawah positif hanya berpihak pada diri mereka sendiri (00000-49999). Akibatnya, digit teratas menjadi 5-9 berarti angka yang diwakili negatif, dan menjadi 0-4 berarti yang diwakili positif - persis sama dengan bit atas yang mewakili tanda pada bilangan biner komplemen dua.

Memahami ini juga sulit bagiku. Setelah saya mendapatkannya dan kembali membaca kembali buku-buku artikel dan penjelasan (tidak ada internet saat itu), ternyata banyak dari mereka yang menggambarkannya tidak benar-benar memahaminya. Saya menulis bahasa majelis pengajaran buku setelah itu (yang terjual dengan cukup baik selama 10 tahun).

Alister
sumber
5

Dua komplemen ditemukan dengan menambahkan satu ke komplemen pertama dari nomor yang diberikan. Katakanlah kita harus mencari dua komplemen 10101kemudian menemukan komplemennya, yaitu, 01010tambahkan 1ke hasil ini, yaitu 01010+1=01011,, yang merupakan jawaban akhir.

evaa
sumber
4

Mari kita dapatkan jawaban 10 - 12 dalam bentuk biner menggunakan 8 bit: Apa yang akan kita lakukan adalah 10 + (-12)

Kita perlu mendapatkan bagian pujian dari 12 untuk mengurangi dari 10.12 dalam biner adalah 00001100. 10 dalam biner adalah 00001010.

Untuk mendapatkan bagian pujian dari 12 kita hanya membalikkan semua bit kemudian menambahkan 1. 12 dalam biner terbalik adalah 11110011. Ini juga merupakan kode Inverse (komplemen seseorang). Sekarang kita perlu menambahkan satu, yang sekarang 11110100.

Jadi 11110100 adalah pujian dari 12! Mudah ketika Anda memikirkannya seperti ini.

Sekarang Anda dapat menyelesaikan pertanyaan 10-12 di atas dalam bentuk biner.

00001010
11110100
-----------------
11111110  
NightSky
sumber
3

Komplemen 2: Ketika kita menambahkan satu tambahan dengan komplemen nomor 1 kita akan mendapatkan komplemen 2 itu. Misalnya: 100101 komplemen 1 adalah 011010 dan komplemen 2 adalah 011010 + 1 = 011011 (Dengan menambahkan satu dengan komplemen 1) Untuk informasi lebih lanjut , artikel ini menjelaskannya secara grafis.

Milon
sumber
plus1 untuk tautan yang memiliki penjelasan dengan lingkaran
Manohar Reddy Poreddy
3

Melihat sistem komplemen keduanya dari sudut pandang matematika itu benar-benar masuk akal. Dalam komplemen sepuluh, idenya adalah pada dasarnya 'mengisolasi' perbedaan.

Contoh: 63 - 24 = x

Kami menambahkan komplemen dari 24 yang benar-benar adil (100 - 24). Jadi sungguh, semua yang kita lakukan adalah menambahkan 100 pada kedua sisi persamaan.

Sekarang persamaannya adalah: 100 + 63 - 24 = x + 100, itu sebabnya kami menghapus 100 (atau 10 atau 1000 atau apa pun).

Karena situasi yang tidak nyaman karena harus mengurangi satu angka dari rantai panjang nol, kami menggunakan sistem 'radix komplemen yang berkurang', dalam sistem desimal, komplemen sembilan.

Ketika kita disajikan dengan angka yang dikurangi dari rantai besar sembilan, kita hanya perlu membalikkan jumlahnya.

Contoh: 99999 - 03275 = 96724

Itulah alasannya, setelah komplemen sembilan, kita menambahkan 1. Seperti yang mungkin Anda ketahui dari matematika masa kanak-kanak, 9 menjadi 10 dengan 'mencuri' 1. Jadi pada dasarnya hanya komplemen sepuluh yang mengambil 1 dari perbedaan.

Dalam Binary, komplemen dua sama dengan komplemen sepuluh, sedangkan komplemen satu untuk komplemen sembilan. Perbedaan utama adalah bahwa alih-alih mencoba mengisolasi perbedaan dengan kekuatan sepuluh (menambahkan 10, 100, dll ke dalam persamaan) kita mencoba mengisolasi perbedaan dengan kekuatan dua.

Karena alasan inilah kami membalikkan bit. Sama seperti bagaimana minuend kita adalah rantai nin dalam desimal, minuend kita adalah rantai yang dalam biner.

Contoh: 111111 - 101001 = 010110

Karena rantai yang 1 di bawah kekuatan dua yang bagus, mereka 'mencuri' 1 dari perbedaan seperti sembilan lakukan dalam desimal.

Ketika kita menggunakan angka biner negatif, kita hanya mengatakan:

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Untuk 'mengisolasi' x, kita perlu menambahkan 1 karena 1111 adalah satu dari 10.000 dan kita menghapus 1 yang memimpin karena kita baru saja menambahkannya ke perbedaan asli.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10.000

Hapus saja 10000 dari kedua sisi untuk mendapatkan x, itu adalah aljabar dasar.

KyBrooks
sumber
3

Banyak jawaban sejauh ini dengan baik menjelaskan mengapa komplemen dua digunakan untuk mewakili angka negatif, tetapi tidak memberi tahu kami apa nomor komplemen dua itu, terutama bukan mengapa '1' ditambahkan, dan pada kenyataannya sering ditambahkan dengan cara yang salah.

Kebingungan berasal dari pemahaman yang buruk tentang definisi bilangan pelengkap. Pelengkap adalah bagian yang hilang yang akan membuat sesuatu menjadi lengkap.

Komplemen radix dari bilangan n digit x dalam radix b adalah, menurut definisi, b ^ nx. Dalam biner 4 diwakili oleh 100, yang memiliki 3 digit (n = 3) dan radix 2 (b = 2). Jadi komplemen radixnya adalah b ^ nx = 2 ^ 3-4 = 8-4 = 4 (atau 100 dalam biner).

Namun, dalam biner mendapatkan komplemen radix tidak semudah mendapatkan komplemen radix yang berkurang, yang didefinisikan sebagai (b ^ n-1) -y, hanya 1 kurang dari komplemen radix. Untuk mendapatkan pelengkap radix yang berkurang, Anda cukup membalik semua digit.

100 -> 011 (diperkecil (miliknya) pelengkap radix)

untuk mendapatkan pelengkap radix (dua), kita cukup menambahkan 1, seperti definisi yang didefinisikan.

011 +1 -> 100 (komplemen dua).

Sekarang dengan pemahaman baru ini, mari kita lihat contoh yang diberikan oleh Vincent Ramdhanie (lihat tanggapan kedua di atas)

/ * mulai dari Vincent

Mengonversi 1111 ke desimal:

Angka dimulai dengan 1, jadi negatif, jadi kami menemukan komplemen dari 1111, yaitu 0000. Tambahkan 1 hingga 0000, dan kami memperoleh 0001. Konversikan 0001 ke desimal, yaitu 1. Terapkan tanda = -1. Tada!

akhir dari Vincent * /

Harus dipahami sebagai

Angka dimulai dengan 1, jadi negatif. Jadi kita tahu itu adalah pelengkap dua dari beberapa nilai x. Untuk menemukan x yang diwakili oleh komplemen keduanya, pertama-tama kita perlu menemukan komplemen 1-nya.

komplemen dua x: 1111 komplemen x: 1111-1 -> 1110; x = 0001, (balik semua digit)

terapkan tanda -, dan jawabannya = -x = -1.

pengguna779764
sumber
3

Kata pelengkap berasal dari kelengkapan. Dalam dunia desimal angka 0 hingga 9 memberikan pelengkap (set lengkap) angka atau simbol angka untuk mengekspresikan semua angka desimal. Di dunia biner, angka 0 dan 1 menyediakan pelengkap angka untuk mengekspresikan semua angka biner. Faktanya Simbol 0 dan 1 harus digunakan untuk mewakili semuanya (teks, gambar, dll) serta positif (0) dan negatif (1). Di dunia kita, ruang kosong di sebelah kiri angka dianggap nol:

                  35=035=000000035.

Di lokasi penyimpanan komputer tidak ada ruang kosong. Semua bit (digit biner) harus 0 atau 1. Untuk secara efisien menggunakan nomor memori dapat disimpan sebagai representasi 8 bit, 16 bit, 32 bit, 64 bit, 128 bit. Ketika nomor yang disimpan sebagai nomor 8 bit ditransfer ke lokasi 16 bit, tanda dan besarnya (nilai absolut) harus tetap sama. Representasi komplemen 1 dan representasi komplemen 2 memfasilitasi ini. Sebagai kata benda: Kedua komplemen 1 dan komplemen 2 adalah representasi biner dari jumlah yang ditandatangani di mana bit yang paling signifikan (yang di sebelah kiri) adalah bit tanda. 0 untuk positif dan 1 untuk negatif. Pelengkap 2s tidak berarti negatif. Ini berarti jumlah yang ditandatangani. Seperti dalam desimal, besarnya direpresentasikan sebagai kuantitas positif. Struktur menggunakan ekstensi tanda untuk mempertahankan kuantitas saat mempromosikan ke register [] dengan lebih banyak bit:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Sebagai kata kerja: komplemen 2 berarti meniadakan . Bukan berarti bikin negatif. Itu berarti jika negatif membuat positif; jika positif buat negatif. Magnitudo adalah nilai absolut:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Kemampuan ini memungkinkan pengurangan biner yang efisien menggunakan meniadakan lalu menambahkan. a - b = a + (-b)

Cara resmi untuk mengambil komplemen 1 adalah untuk setiap digit kurangi nilainya dari 1.

        1'scomp(0101) = 1010.

Ini sama dengan membalik atau membalik setiap bit satu per satu. Ini menghasilkan nol negatif yang tidak disukai sehingga menambahkan satu ke komplemen 1 menghilangkan masalah. Untuk meniadakan atau mengambil komplemen 2s terlebih dahulu ambil komplemen 1s kemudian tambahkan 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

Dalam contoh-contoh negasi bekerja juga dengan tanda bilangan diperpanjang.

Menambahkan:
1110 Carry 111110 Carry 0110 sama dengan 000110 1111 111111 jumlah 0101 jumlah 000101

Menarik:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Perhatikan bahwa ketika bekerja dengan komplemen 2's, ruang kosong di sebelah kiri nomor diisi dengan nol untuk angka positif tetapi diisi dengan yang untuk angka negatif. Carry selalu ditambahkan dan harus berupa 1 atau 0.

Bersulang

Russ
sumber
3

Pelengkap 2 pada dasarnya adalah cara untuk datang dengan aditif kebalikan dari angka biner. Tanyakan pada diri sendiri: Diberikan angka dalam bentuk biner, pola bit apa, ketika ditambahkan ke nomor asli, yang akan membuat hasilnya nol? Jika Anda dapat menemukan pola bit ini maka pola bit tersebut adalah representasi -ve (aditif terbalik) dari angka asli; seperti definisi menambahkan nomor ke aditif kebalikannya harus selalu menghasilkan nol. Contoh: ambil 101, yang merupakan desimal 5. Sekarang tugasnya adalah membuat pola bit yang bila ditambahkan ke pola bit yang diberikan (101) akan menghasilkan nol. Untuk melakukan itu, mulailah dari bit paling kanan 101 dan untuk setiap bit individual, tanyakan lagi pertanyaan yang sama: Bit apa yang harus saya tambahkan ke bit "ini" untuk membuat hasilnya nol? terus melakukan hal itu dengan mempertimbangkan carry over yang biasa. Setelah kita selesai dengan 3 tempat paling kanan (digit yang menentukan angka asli tanpa memperhatikan nol terkemuka) carry terakhir masuk dalam pola bit dari aditif terbalik. Selain itu, karena kita bisa menahan angka asli dalam katakanlah satu byte, semua bit terkemuka lainnya dalam invers aditif juga harus 1 sehingga ketika komputer menambahkan nomor dan invers aditifnya menggunakan "bahwa" jenis penyimpanan (karakter) hasil di char itu akan menjadi nol.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0
n-bu
sumber
2

Saya menyukai jawaban lavinio, tetapi menggeser bit menambah kompleksitas. Seringkali ada pilihan bit bergerak sambil menghormati bit tanda atau sambil tidak menghormati bit tanda. Ini adalah pilihan antara memperlakukan angka sebagai ditandatangani (-8 hingga 7 untuk gigitan, -128 hingga 127 untuk byte) atau angka tak bertanda rentang penuh (0 hingga 15 untuk camilan, 0 hingga 255 untuk byte).

Nosredna
sumber
2

Ini adalah cara cerdik untuk mengkode bilangan bulat negatif sedemikian rupa sehingga sekitar setengah dari kombinasi bit dari tipe data dicadangkan untuk bilangan bulat negatif, dan penambahan sebagian besar bilangan bulat negatif dengan bilangan bulat positif yang sesuai akan menghasilkan carry overflow yang meninggalkan hasilnya menjadi nol biner.

Jadi, dalam komplemen 2 jika satu adalah 0x0001 maka -1 adalah 0x1111, karena itu akan menghasilkan jumlah gabungan 0x0000 (dengan limpahan 1).

Edwin Buck
sumber
1

Komplemen dua adalah salah satu cara mengekspresikan angka negatif dan sebagian besar pengontrol dan prosesor menyimpan angka negatif dalam bentuk komplemen 2

Denis Roosevelt
sumber
1
Ini tidak menambah apa pun pada informasi yang disediakan oleh jawaban lain.
Adrian Mole
1

Pelengkap dua ini terutama digunakan untuk alasan berikut:

  1. Untuk menghindari beberapa representasi 0
  2. Untuk menghindari melacak carry bit (seperti pada komplemen seseorang) jika terjadi luapan.
  3. Melakukan operasi sederhana seperti penambahan dan pengurangan menjadi mudah.
K.N. Bhargav
sumber
0

REFERENSI: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Saya membalikkan semua bit dan menambahkan 1. Secara terprogram:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;
Charles Thomas
sumber
Bahkan assembler akan menjadi level yang terlalu tinggi. Perlu melihat skema tingkat gerbang logika penjumlahan. Dengan siklus T. Anda secara algoritmik benar.
mckenzm
0

Komplemen 2 dari angka yang diberikan adalah no. dapatkan dengan menambahkan 1 dengan komplemen 1 dari no. misalkan, kita memiliki nomor biner .: 10111001101 Komplemen 1 adalah: 01000110010 Dan pelengkap 2 adalah: 01000110011

user10862846
sumber
0

Untuk melengkapi bitwise angka adalah membalik semua bit di dalamnya. Untuk melengkapi dua, kami membalik semua bit dan menambahkan satu.

Menggunakan representasi komplemen 2 untuk bilangan bulat yang ditandatangani, kami menerapkan operasi komplemen 2 untuk mengonversi bilangan positif ke ekuivalen negatif dan sebaliknya. Jadi menggunakan camilan sebagai contoh, 0001(1) menjadi 1111(-1) dan menerapkan op lagi, kembali ke 0001.

Perilaku operasi pada nol menguntungkan dalam memberikan representasi tunggal untuk nol tanpa penanganan khusus nol dan negatif. 0000melengkapi 1111, yang ketika 1 ditambahkan. meluap ke0000 , memberi kita satu nol, bukan yang positif dan negatif.

Keuntungan utama dari representasi ini adalah bahwa sirkuit penambahan standar untuk bilangan bulat tak bertanda menghasilkan hasil yang benar ketika diterapkan pada mereka. Misalnya menambahkan 1 dan -1 dalam camilan:, 0001 + 1111bit meluap keluar dari register, meninggalkan 0000.

Untuk perkenalan yang lembut, Computerphile yang luar biasa telah menghasilkan video tentang subjek tersebut .

ahcox
sumber
0

Secara sederhana 2's Complement adalah cara untuk menyimpan angka negatif dalam Memori Komputer. Sedangkan Angka Positif disimpan sebagai Angka Biner Normal.

Mari kita perhatikan contoh ini,

Komputer menggunakan Binary Number Systemuntuk mewakili angka berapa pun.

x = 5;

Ini direpresentasikan sebagai 0101.

x = -5;

Ketika komputer encouters -menandatangani, itu menghitung komplemen 2 itu dan menyimpannya. i.e5 = 0101 dan komplemen 2 adalah 1011.

Aturan penting yang digunakan komputer untuk memproses angka adalah,

  1. Jika bit pertama adalah 1maka harus negativeangka.
  2. Jika semua bit kecuali bit pertama 0maka itu adalah angka positif karena tidak ada -0sistem bilangan. ( 1000 is not -0Sebaliknya itu positif 8)
  3. Jika semua bit 0maka itu 0.
  4. Kalau tidak, itu adalah positive number.
Raghu
sumber
-6

Jawaban paling sederhana:

1111 + 1 = (1) 0000. Jadi 1111 harus -1. Lalu -1 + 1 = 0.

Sangat sempurna untuk memahami ini semua untukku.

Dmitry
sumber
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka.
Codor
Itu jawabannya. Yang paling sederhana. Bagi saya - yang terbaik.
Dmitry