Apa keuntungan dari Two's Complement?


11

Dalam beberapa perangkat ADC / DAC, mereka adalah opsi untuk menampilkan / memasukkan data dalam formulir Komplemen 2.

Apa keuntungan dari merepresentasikan data digital dalam bentuk Komplemen Dua Saat Anda dapat memiliki kode biner langsung dan menghemat waktu konversi?


4
Pujian dua adalah kode biner lurus ...
Mooing Duck

"Aljabar dijalankan pada mesin (alam semesta) yang merupakan pelengkap dua" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton

2
Berapakah 5 dalam komplemen dua? 101. Berapakah 5 dalam kode biner lurus? 101. Apakah -5 dalam komplemen dua? 1 ... 11111011. Apa -5 dalam kode biner lurus? Uhh ...
user253751

Sepertinya kasus khusus yang langka untuk memiliki ADC dengan output negatif? Apa artinya itu, bahwa tegangan yang diukur lebih rendah dari tegangan referensi rendah? Dan bagaimana Anda membangun ADC seperti itu? Perkiraan berturut-turut dengan tutup yang memiliki muatan negatif ...?
Lundin

Perhatikan bahwa ada dua kata berbeda , complEment dan complIment . Subjek di sini adalah keluhan dua orang , bahkan jika mereka berdua sangat sopan dan sering mengatakan hal-hal baik tentang Anda.
Pete Becker

Jawaban:


11

Representasi pujian dua dari bilangan bulat yang ditandatangani mudah dimanipulasi dalam perangkat keras. Misalnya, negasi (yaitu x = -x ) dapat dilakukan hanya dengan membalik semua bit dalam angka dan menambahkannya. Melakukan operasi yang sama dalam biner mentah (misalnya dengan bit tanda) biasanya melibatkan lebih banyak pekerjaan, karena Anda harus memperlakukan bit tertentu dalam aliran sebagai spesial. Hal yang sama berlaku untuk penambahan - operasi penambahan untuk angka negatif identik dengan operasi penambahan untuk angka positif, jadi tidak ada logika tambahan (tidak ada permainan kata-kata) yang diperlukan untuk menangani kasus negatif.

Meskipun ini tidak berarti lebih mudah dari sudut pandang Anda, sebagai konsumen data ini, itu mengurangi upaya desain dan kompleksitas perangkat, sehingga mungkin membuatnya lebih murah.


1
Membalik bit lalu menambahkan 1 untuk meniadakan, bukan ??
Scott Seidman

2
@ScottSeidman Ya, maaf, saya lupa sedikit itu. Diedit untuk memperbaiki :)
Polinomial

1
Sebenarnya, untuk pilih-pilih maksimum, tergantung pada prosesornya mungkin satu siklus untuk mengambil x = x * -1, atau x = 0 - x , dibandingkan setidaknya dua siklus untuk x = ~ x + 1
markt

@markt Ya, tetapi jika Anda hanya menerapkan perangkat minimal (yaitu bukan prosesor penuh) maka masuk akal untuk memotong kompleksitas silikon ke minimum.
Polinomial

5
+1 Juga, komplemen Dua hanya memiliki nilai tunggal untuk 0. Lainnya (seperti komplemen seseorang atau bit tanda) akhirnya memiliki dua
bel

5

ADC dapat mengonversi data (katakanlah tegangan input antara 0 dan 5V) dan Anda juga memerlukan data tersebut tidak ditandatangani (0V = 0, 5V = kode maks) atau ditandatangani (2.5V = 0, 0V = maks -ve, 5V = maks + ve).

Selain komplemen 2 yang menjadi representasi komputer paling umum untuk data yang ditandatangani, konversi antara dua format yang dijelaskan di atas benar-benar sepele: cukup membalikkan MSB!

Ini sangat murah untuk ditambahkan ke logika internal ADC dan memberi ADC titik penjualan lain pada lembar data ...


Baru saja menambahkan saklar MSB antara komplemen dua dan mengimbangi biner sebagai komentar di bawah ini
Scott Seidman

3

Jika Anda perlu melakukan matematika pada representasi bilangan negatif, dua komplemen membuatnya lebih mudah daripada mengimbangi biner, yang akan cocok dengan tipe data "masuk int". Kompiler Anda hanya akan tahu cara menghadapinya. Jika tidak, Anda menghabiskan kutu waktu untuk mengonversi bolak-balik.


1

Dalam pertanyaan, tampaknya tersirat bahwa ADC membutuhkan waktu lebih lama untuk mengembalikan nilai dalam bentuk komplemen 2 daripada dalam biner lurus. Meskipun ini mungkin terjadi dalam beberapa implementasi ADC tertentu, itu tidak benar secara umum (misalnya seri MSP430 pengendali mikro memiliki chip on-chip ADC yang akan melaporkan nilai dalam biner lurus atau pelengkap 2, tetapi itu mengambil jumlah siklus yang sama dalam kedua kasus).

Dengan itu, pilihan antara komplemen 2 dan biner lurus sebagian besar tergantung pada bagaimana transduser Anda bekerja dan bagaimana Anda ingin memproses data Anda.

Dalam mode biner lurus, ADC memberi Anda angka yang mewakili rasio antara besarnya kuantitas analog yang diukur (hampir selalu bertegangan) dan kuantitas referensi skala penuh. Misalnya, ADC 10-bit dapat mengembalikan nilai dari 0 hingga 1023 (inklusif). Jika Anda mengukur tegangan (katakanlah, 1,25 Volt) yang merupakan setengah dari tegangan referensi ADC (katakanlah, 2,50 Volt), kode biner yang Anda baca akan menjadi setengah dari nilai maksimum yang dapat Anda baca - jadi, 512, atau sekitar itu, tunduk pada pembulatan dan non-linearitas di ADC.

Sebagai contoh, katakanlah Anda memiliki transduser yang melaporkan jumlah bahan bakar roket di tangki. 0V berarti tangki kosong dan 2.5V Volts berarti penuh. Jadi Anda hanya menghubungkan transduser ke ADC Anda, dan pergilah!

Tetapi perhatikan bahwa dalam paragraf di atas, tidak ada cara untuk mengukur tegangan negatif. Bagaimana jika kita ingin mengukur aliran bahan bakar roket masuk dan keluar dari tangki (dan kita memiliki transduser untuk melakukannya)? ADC tidak dapat mengukur angka negatif, jadi kami memiliki masalah. Namun, ada cara mudah untuk memalsukannya menggunakan mode komplemen 2's: Dalam hal ini, output transduser bias kembali sehingga titik nol berada di antara dua tegangan referensi ADC. Dengan kata lain, aliran positif diwakili oleh tegangan antara 1.25V dan 2.50V, dan aliran negatif diwakili oleh 1.25V ke 0V - jadi aliran ke tangki akan memberikan kode ADC 512 hingga 1023 dan mengalir keluar dari ucapan terima kasih akan memberikan kode 511 hingga 0 (dalam format biner lurus).

Nah, itu sangat merepotkan. Kita harus mengurangi 512 dari setiap pengukuran sebelum melakukan sesuatu dengannya, yang memberikan angka pada rentang -512 hingga +511. Inti dari mode komplemen 2 adalah ia melakukan ini untuk Anda!

Namun, Anda mungkin masih ingin menggunakan biner lurus dengan transduser yang menghasilkan hasil yang ditandatangani. Misalnya, transduser Anda mungkin memiliki output diferensial: Dalam hal ini Anda ingin mengurangi output yang dibalik dari output yang tidak terbalik, jadi tidak ada keuntungan menggunakan komplemen 2's.


1

Sistem pelengkap keduanya digunakan, karena berasal dari cara kerja perangkat keras sederhana secara alami. Pikirkan misalnya odometer mobil Anda, yang telah Anda setel ke nol. Kemudian letakkan gigi mundur, dan berkendara mundur sejauh 1 mil (Tolong jangan lakukan ini dalam kenyataan). Odometer Anda (jika mekanis) akan bergulir dari 0000 hingga 9999. Sistem komplemen keduanya berperilaku sama.

masukkan deskripsi gambar di sini


Harap dicatat bahwa saya tidak benar-benar menawarkan informasi baru di sini, hanya contoh odometer yang mungkin membantu seseorang - itu membantu saya untuk memahami alasan sistem komplemen dua ketika saya masih muda. Setelah itu, mudah bagi saya untuk secara intuitif menerima bahwa adders, subtractor dll bekerja dengan baik dengan sistem komplemen keduanya.

Dan ya, odometer Nissan saya berfungsi seperti ini.


Jawaban Anda adalah tentang overflow (dan underflow), tetapi karena odometer tidak menampilkan angka negatif, itu tidak membahas apa pun yang terkait dengan pelengkap apa pun ...
marcelm

@marcelm, Sebenarnya, contoh odometer tidak menjelaskan pelengkap berpasangan. Hanya saja PkP tidak cukup jauh dengan penjelasannya. Jika odometer enam digit berbunyi nol, dan Anda mengemudi secara terbalik sejauh satu mil, maka Anda akan mengharapkannya untuk membaca -1. Sebaliknya, bunyinya 999999. Itu karena 999999 adalah enam digit, puluhan representasi pelengkap -1.
Solomon Slow

@jameslarge Tidak, masih tidak. Tidak ada jawaban yang benar-benar menyentuh pelengkap dua. Atau komplemen seseorang, atau tanda-besarnya, atau representasi nomor yang ditandatangani.
marcelm

@marcelm Ya ada: ide inti dari sistem komplemen dua: bahwa nol minus satu sama dengan integer unsigned representable maksimum. Itulah ide sistem komplemen dua. Tidak ada representasi nomor yang ditandatangani yang menawarkan ini (setahu saya). Dan contoh odometer menunjukkan bagaimana sifat perilaku ini secara alami berasal dari kesederhanaan teknik; dalam hal odometer: dari teknik mesin. Baik di dunia mekanik dan elektronik, itu (sistem pelengkap keduanya) adalah cara paling sederhana untuk membuatnya bekerja.
PkP

0

Yang lain sudah menjawab mengapa dua binary pujian itu nyaman untuk perangkat keras komputer. Namun, Anda tampaknya bertanya mengapa A / D akan menghasilkan pujian berpasangan alih-alih "straight binary" (apa pun yang menurut Anda benar-benar berarti).

Kebanyakan A / D menghasilkan nilai biner sederhana tanpa tanda mulai dari 0 hingga 2 N -1, di mana N adalah jumlah bit yang dikonversi A / D. Perhatikan bahwa ini juga dapat dianggap sebagai notasi pujian berpasangan, hanya saja nilainya tidak pernah negatif. Jika Anda hanya berurusan dengan angka positif, maka sebagian besar representasi biner adalah sama. Ini termasuk pujian dua kali lipat dan tanda besarnya.

Beberapa A / D, terutama yang dibangun dalam mikrokontroler, memiliki opsi untuk menghasilkan nilai negatif untuk bagian bawah kisaran mereka. Ini bisa menjadi keuntungan yang dirasakan saat mengukur sinyal bipolar.

Setidaknya dalam mikrokontroler, ini umumnya konyol. Dalam beberapa kasus, Anda mungkin menggunakan nilai A / D secara langsung tanpa konversi apa pun. Dalam hal ini, Anda telah mengonversi semua nilai lainnya ke rentang A / D. Membatasi itu untuk semua angka non-negatif sebenarnya menyederhanakan banyak hal.

Jika tidak, Anda akan menerapkan beberapa penskalaan dan mengimbangi pembacaan A / D untuk memasukkannya ke dalam unit apa pun yang Anda gunakan untuk nilai-nilai secara internal. Di sini sekali lagi tidak ada downside ke nilai yang tidak ditandatangani datang langsung dari A / D. Bahkan, saya biasanya menerapkan beberapa penyaringan lulus rendah pada nilai mentah sebelum penskalaan dan offset. Mengetahui nilai-nilai itu tidak akan negatif menyederhanakan perhitungan sedikit. Melakukan penskalaan pada nilai yang tidak ditandatangani juga membuat hal-hal sedikit lebih sederhana kadang-kadang.

Saya tidak ingat satu kasus di lebih dari 100 proyek mikrokontroler di mana saya menggunakan A / D dalam format output apa pun kecuali yang tidak ditandatangani.

Jadi untuk menjawab pertanyaan tentang apa keuntungan dari A / D keluaran "pujian berpasangan", ada dua jawaban:

  1. Mereka semua tetap melakukannya, hanya saja sebagian besar waktu nilai-nilai ini tidak negatif, jadi Anda tidak bisa membedakan antara pujian berpasangan dan notasi lainnya, seperti besarnya tanda.

  2. Keuntungannya sangat kecil. Di dalam mikrokontroler mereka pada dasarnya tidak ada.

    Dalam perangkat keras khusus, mungkin ada beberapa keuntungan memiliki nilai negatif yang menunjukkan tegangan input negatif, dalam hal ini, pujian dua kali lipat adalah cara termudah untuk menangani kisaran nilai. Perhatikan bahwa jika rentang tegangan input tidak simetris tentang 0, maka keuntungan ini hilang.


-1

Apa 'kode biner lurus' yang Anda bicarakan? Saya berasumsi maksud Anda memiliki sedikit tanda yang '1' untuk negatif dan '0' untuk positif (atau sebaliknya ). Ini memiliki dua kelemahan lebih dari dua pelengkap yang belum disebutkan: satu sebagian besar tidak relevan hari ini dan satu penting.

Yang sebagian besar tidak relevan adalah bahwa Anda dapat mewakili satu angka lebih sedikit - yaitu 255 angka dalam 8 bit. Ini sangat tidak relevan ketika Anda memiliki 32 atau 64 bit tetapi penting ketika Anda memiliki sedikitnya 4 atau 6 bit untuk bekerja dengannya.

Yang lebih penting adalah bahwa sekarang ada dua cara untuk mewakili angka yang sama - khususnya, 0 - +0 dan -0 tetapi +0 dan -0 adalah angka yang sama sehingga implementasi Anda perlu memastikan bahwa Anda tidak membandingkan ini angka setiap kali Anda melakukan pemeriksaan kesetaraan.


Saya pikir Anda keluar jalur di sini. Anda berbicara tentang representasi sign-magnitude ketika OP cukup jelas berbicara tentang representasi biner yang tidak ditandatangani.
Joe Hass

1
Jika Anda berbicara tentang representasi yang tidak ditandatangani maka tidak ada keuntungan untuk komplemen Dua. Itu hanya membuang sedikit.
Jack Aidley
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.