Mengapa memilih komplemen dua daripada sign-and-magnitude untuk nomor yang ditandatangani?


201

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!


6
FWIW, metode "intuitif" Anda untuk menggunakan bit tanda digunakan secara bersamaan - misalnya, sebagian besar komputer menggunakan bit tanda ketika mewakili angka floating point.
Adisak

2
@Adisak Ini disebut besaran yang ditandatangani
Cole Johnson

2
Saya selalu mengaitkan representasi tanda dan magnitudo dengan bilangan bulat karena angka Floating Point mengandung tiga komponen: tanda, eksponen, dan mantissa (seringkali dengan implisit '1'). Tapi saya kira itu cukup mudah untuk memperlakukan eksponen dan mantissa sama besarnya dengan yang orang sadari mereka tidak sepenuhnya linier.
Adisak

Berikut adalah artikel yang membahas bagaimana angka floating-point disimpan dalam biner, bagi mereka yang ingin tahu tentang pernyataan @ Adisak.
GDP2

Baru saja melihat video yang bagus menjelaskan youtube.com/watch?v=dHB7jFjESLY
allenlinli

Jawaban:


333

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 0010dan 1001, masing-masing (saya berpegang pada 4 bit untuk ukuran). Dengan cara melengkapi keduanya, mereka adalah 0010dan 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.


13
Saya setuju. Pelengkap 2 bekerja. Tapi bagaimana kita sampai pada awalnya? Jika seandainya saya perlu sampai pada notasi ini, bagaimana proses pemikirannya. Saya pikir tiba di komplemen 2 harus lebih dari sekedar keberuntungan, bukan?
Lazer

1
Juga, mengapa tidak ada mitra pelengkap 2 untuk pelampung?
Lazer

6
@Lazer periksa artikel ini untuk mengetahui how we arrived at 2s compliment the first place. cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Ankit

1
Java hanya telah menandatangani tipe integer sejauh yang saya ketahui, sehingga selalu memperlakukannya dalam interpretasi komplemen keduanya. Dalam bahasa lain, bagaimana nilai diperlakukan tergantung pada bagaimana kode memperlakukannya. Tidak ada yang memberitahu Anda bahwa blok memori adalah bilangan bulat yang ditandatangani atau tidak ditandatangani atau dobel atau string atau sesuatu yang lain. Data mentah adalah tipe apa pun yang Anda pilih untuk menafsirkannya.
Welbog

3
@ Suraj, saya sarankan melihat artikel Wikipedia di pelengkap dua untuk jawaban lengkap: en.wikipedia.org/wiki/Two%27s_complement . Jawaban singkatnya adalah MSB 1menunjukkan -8, dan tiga sisanya 1s menunjukkan 4, 2, dan 1, masing-masing, sehingga -8+4+2+1 = -1.
Welbog

18

Wikipedia mengatakan semuanya:

Sistem dua-pelengkap memiliki keuntungan karena tidak mensyaratkan bahwa sirkuit penambahan dan pengurangan memeriksa tanda-tanda operan untuk menentukan apakah akan menambah atau mengurangi. Properti ini membuat sistem lebih mudah untuk diimplementasikan dan mampu menangani aritmatika dengan presisi lebih tinggi. Juga, nol hanya memiliki satu representasi, meniadakan seluk-beluk terkait dengan nol negatif, yang ada dalam sistem komplemen satu.

Dengan kata lain, menambahkan adalah sama, apakah angka tersebut negatif.


Pak, jika saya menulis char a = 12; dan unsigned char b = 12, apakah derai bit yang mendasarinya sama, apa yang sebenarnya terjadi?
Suraj Jain

Tidak ada yang berubah saat menulis atau membaca. Hanya berlaku saat penambahan atau pengurangan.
Talespin_Kit

12

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:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Sekarang apa yang akan terjadi jika kami mencoba menambahkan 1 lagi ke hasilnya. Ini akan menghasilkan luapan.

Hasilnya 1 0000adalah 0 (karena kami bekerja dengan angka 4 bit, (angka 1 di sebelah kiri adalah overflow)

Jadi,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

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.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

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.


1
Diberi +1 Itu adalah informasi, namun pada akhirnya saya tidak yakin mengapa Anda ingin memiliki pendekatan yang paling signifikan untuk mewakili apakah itu angka positif atau negatif. Ini memiliki banyak masalah seperti 0 akan memiliki 2 representasi - 0000 (+) dan 1000 (-) .. Juga penambahan dan pengurangan tidak dapat dilakukan dengan menggunakan algoritma yang sama. Ketika Anda mengatakan 0100 normal maka itu adalah +8 dan ketika Anda mengatakan komplemen dua 0100 maka itu adalah -12 ..
hagrawal

8

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).


6

ini untuk menyederhanakan jumlah dan perbedaan angka. jumlah angka negatif dan positif yang dikodifikasikan dalam komplemen 2 sama dengan menjumlahkannya dengan cara normal.


5

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.


4

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.


4

Untuk memperluas jawaban orang lain:

Dalam pelengkap dua

  • Menambahkan adalah mekanisme yang sama dengan menambahkan bilangan bulat positif.
  • Mengurangkan tidak berubah juga
  • Multiplikasi juga!

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.


Bukan hanya multiplikasi non-pelebaran yang sama . Tetapi karena sebagian besar bahasa tingkat tinggi tidak mendukung pelebaran multiplikasi tanpa pemeran eksplisit, hasilnya akan sama dalam bahasa-bahasa tersebut.
phuclv

@ LưuVĩnhPhúc: Penggandaan pelebaran biasanya akan sama, tetapi hasil untuk penggandaan yang ditandatangani dan tidak ditandatangani hanya dijamin sama jika hasilnya sesuai dengan kisaran int yang ditandatangani. Beberapa kompiler seperti gcc, diberi sesuatu seperti 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.
supercat

2

Membaca jawaban atas pertanyaan ini, saya menemukan komentar ini [diedit].

Pelengkap 2 dari 0100 (4) akan menjadi 1100. Sekarang 1100 adalah 12 jika saya katakan secara normal. Jadi, ketika saya mengatakan normal 1100 maka itu adalah 12, tetapi ketika saya mengatakan 2 melengkapi 1100 maka itu adalah -4? Juga, di Jawa ketika 1100 (mari kita asumsikan 4 bit untuk saat ini) disimpan lalu bagaimana hal itu ditentukan jika itu +12 atau -4 ?? - hagrawal 2 Jul pukul 16:53

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

  • berapa byte yang harus dipertimbangkan
  • bagaimana byte tersebut harus ditafsirkan

CONTOH - Di bawah ini kita menganggap itu

  • charPanjangnya 1 byte
  • shortPanjangnya 2 byte
  • intPanjangnya dan floatadalah 4 byte

Harap 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 heksadesimal BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Kemudian kami membaca konten array menggunakan berbagai jenis.

unsigned char dan signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short dan short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, intdanfloat

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

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_Just4Bytesarray

  • unsigned char: 1 byte dalam biner biasa
  • signed char: 1 byte dalam komplemen 2's
  • unsigned short: 2 byte dalam notasi biner biasa
  • short: 2 byte dalam komplemen 2 ini
  • unsigned int: 4 byte dalam notasi biner biasa
  • int: 4 byte dalam komplemen 2 ini
  • float: 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!


Gumpalan kode itu perlu diedit sehingga pembaca tidak harus terus bergulir ke sana ke mari. Lebih baik, komentar masif di atas harus menjadi teks lama yang sederhana dan biarkan penyaji mengatur formatnya. Anda juga harus menambahkan peringatan pada bit di dekat ujung tempat Anda membahas ukuran dan pemformatan karena ukurannya tidak tetap.
user4581301

+1. Satu hal yang mungkin Anda pertimbangkan untuk dilakukan, @ mw215, adalah membuat pasangan pertanyaan / jawaban ini menjadi entri Wiki Komunitas sendiri, karena ini berguna bagi orang-orang yang mungkin tertarik dengan interpretasi byte mentah di luar konteks matematika komplemen dua.
Welbog

Saya hanya ingin tahu apakah komplemen 2 selalu mengikuti, maksud saya jika saya miliki int x = -4, dan saya kemudian melakukan printf("%d" , x)bagaimana itu ditafsirkan? Juga apa perbedaan antara unsigned intdan signed intdan %ddan %u... ini telah menggangguku untuk waktu yang lama sekarang .Terima kasih.
Suraj Jain

@ Suraj Jain Saat menggunakan inttipe, signedpengubah adalah default. Ini berarti bahwa intdan signed intpersis jenis yang sama. Dengan demikian kedua definisi tersebut int i = -4;dan signed int i = -4;memiliki makna yang sama.
mw215

@ Suraj Jain Sistem menetapkan cara menginterpretasikan urutan byte melalui tipe. Jenis mendefinisikan: berapa banyak byte yang harus dipertimbangkan dan berapa byte yang harus ditafsirkan. An intadalah 4 byte dalam komplemen 2 dan unsigned int4 byte dalam notasi biner biasa (periksa ukuran tipe aktual pada sistem Anda menggunakan sizeofoperator).
mw215

1

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 .


0

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).


0

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 .


0

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.


0

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.


0

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.


0

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 11111111adalah karena mengurangkan bilangan bulat mana pun yang memiliki 8 bit terendah00000001 dari bilangan bulat lain yang 8 bit terendah 0000000akan 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.


Harap Format Jawaban Anda Dalam Paragraf dan tandai kode sebagai kode, itu akan lebih mudah dibaca dan Anda akan mendapatkan upvote.
Suraj Jain

@ SurajJain: Apakah itu lebih baik?
supercat

Ya, lebih baik daripada sebelumnya, saya ingin bertanya satu hal apa perbedaan antara char a ditandatangani = 1 dan char a unsigned = 1, bagaimana mereka diwakili dalam memori.
Suraj Jain

@ SurajJain: Pada sistem dua-pelengkap di mana "char" lebih kecil dari "int" [yaitu sebagian besar sistem], tipe char yang ditandatangani dan tidak ditandatangani akan berperilaku identik kecuali bahwa tipe yang ditandatangani akan diperpanjang dengan tanda tangan ketika jenis yang dibaca dan yang tidak ditandatangani biasa. Pada sistem seperti itu, menyimpan nilai 194 atau -62 ke dalam char yang ditandatangani akan menulis pola bit yang sama dengan menyimpan 194 atau -62 ke dalam char yang tidak ditandatangani (mis. 11000010). Membaca pola bit dari char yang ditandatangani akan menghasilkan -62, dan membacanya dari char yang tidak ditandatangani akan menghasilkan 194.
supercat

perpanjangan tanda berarti?
Suraj Jain

0

Ada berbagai jenis representasi yaitu:

  1. representasi nomor yang tidak ditandatangani
  2. representasi nomor yang ditandatangani
  3. representasi komplemen seseorang
  4. Representasi komplemen dua

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


-1

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


sebenarnya, jika Anda memiliki titik desimal dan eksplisit tentang semua bit itu: "0..0000.1111..1" berarti bahwa semua bit yang tidak dinyatakan paling kiri adalah 0, dan semua bit yang tidak dinyatakan paling kanan adalah 1, dan oleh karena itu "..1" berarti bahwa carry dipicu. Karena itu (secara mekanis) "0,0001.0000..0". Ini berarti bahwa "1..1111.1111..1" sama dengan nol! Ini juga berarti bahwa untuk meniadakan integer, Anda benar-benar hanya membalikkan bitnya. Tapi sekarang berlaku untuk fraksi yang dapat diwakili.
Rob
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.