Neden ikisinin işaretli sayılar için işaret ve büyüklükteki tamamlayıcısını tercih etmelisiniz?


201

İkili olarak -1'i temsil etmenin bir nedeni olup olmadığını merak ediyorum, ikisinin tamamlayıcısı kullanılıyor: bitleri çevirmek ve 1 eklemek?

-1, benim için daha sezgisel olan 10000001 yerine 11111111 (ikisinin tamamlayıcısı) ile temsil edilir, bu da ilk bit negatif bayrak olarak ikili 1 olan 10000001'dir.

Yasal Uyarı: İşim için ikili aritmetiğe güvenmiyorum!


6
FWIW, bir işaret biti kullanmak için "sezgisel" yönteminiz zaman zaman kullanılır - örneğin, çoğu bilgisayar kayan nokta sayılarını temsil ederken bir işaret biti kullanır.
Adisak

2
@Adisak İşaretli büyüklük denir
Cole Johnson

2
Bir işaret, bir üs ve bir mantis (genellikle örtük '1' ile): Kayan Nokta sayıları üç bileşen içerdiğinden, her zaman işaret ve büyüklük temsilini tamsayılarla ilişkilendirdim. Ama sanırım üssü ve mantisayı, biri tam olarak doğrusal olmadıklarını fark ettiği sürece büyüklükte tedavi etmek yeterince kolay.
Adisak

İşte @ Adisak'ın sözlerini merak edenler için kayan nokta sayılarının ikili olarak nasıl saklandığını tartışan bir makale .
GSYİH2

Yanıtlar:


333

Eklemenin negatif sayılarla ilgilenmek için herhangi bir özel mantığa sahip olması gerekmez. Wikipedia'daki makaleye göz atın .

2 ve -1 olmak üzere iki sayınız olduğunu varsayalım. Rakamları temsil etmenin "sezgisel" yolunuzda, bunlar sırasıyla 0010ve 1001(boyut için 4 bite yapışıyorum) olacaktır. Gelen ikinin tamamlayıcı şekilde, bunlar 0010ve1111 . Şimdi bunları eklemek istediğimi varsayalım.

Two'nun tamamlayıcı katkısı çok basittir. Numaraları normal olarak eklersiniz ve sondaki tüm taşıma bitleri atılır. Böylece aşağıdaki gibi eklenirler:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 "2 + (- 1)" in beklenen sonucudur 1'dir.

Ancak "sezgisel" yönteminizde ekleme işlemi daha karmaşıktır:

  0010
+ 1001
= 1011

Hangisi -3, değil mi? Basit ekleme bu durumda çalışmaz. Sayılardan birinin negatif olduğunu ve bu durumda farklı bir algoritma kullandığını not etmeniz gerekir.

Bu "sezgisel" depolama yöntemi için çıkarma, toplama işleminden farklı bir işlemdir ve sayıların eklenebilmesi için ek denetimler yapılmasını gerektirir. En temel işlemlerin (toplama, çıkarma, vb.) Olabildiğince hızlı olmasını istediğinizden, sayıları mümkün olan en basit algoritmaları kullanmanıza izin verecek şekilde depolamanız gerekir.

Ayrıca, "sezgisel" depolama yönteminde iki sıfır vardır:

0000  "zero"
1000  "negative zero"

Sezgisel olarak aynı sayı olan ancak depolandığında iki farklı değere sahip olan. Her uygulamanın sıfır olmayan değerlerin de negatif sıfır olmadığından emin olmak için ek adımlar atması gerekir.

Bu şekilde ints depolamanın başka bir bonusu daha vardır ve o zaman değerin depolandığı kaydın genişliğini genişletmeniz gerekir. İkisinin tamamlayıcısıyla, 8 bitlik bir kayıtta 4 bitlik bir sayı depolamak, en önemli bit:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

Bu sadece daha küçük kelimenin işaret bitine bakmak ve daha büyük kelimenin genişliğini kaplayana kadar tekrar etmek meselesidir.

Yönteminizle, dolguya ek olarak ekstra bir işlem olan mevcut biti temizlemeniz gerekir:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Her iki durumda da bu ekstra 4 biti ayarlamanız gerekir, ancak "sezgisel" durumda 5. biti de temizlemeniz gerekir. Her uygulamada mevcut en temel ve ortak operasyonlardan birinde küçük bir ekstra adımdır.


13
Katılıyorum. 2'nin tamamlayıcı işleri. Ama ilk etapta nasıl ulaştık? Eğer bu gösterime varmam gerekiyorsa, düşünce süreci ne olurdu. Bence 2 tamamlayıcı gelen sadece şans daha fazla olmak zorunda, değil mi?
Lazer

1
Ayrıca, neden şamandıralar için 2'nin tamamlayıcı karşılığı yok?
Lazer

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

1
Java sadece bildiğim kadarıyla tamsayı türlerini imzaladı, bu yüzden her zaman ikisinin tamamlayıcı yorumunda ele alır. Diğer dillerde, değerin nasıl işlendiği kodun ona nasıl davrandığına bağlıdır. Bir bellek bloğunun imzalı veya imzasız bir tamsayı veya bir çift veya bir dize veya başka bir şey olduğunu söyleyecek hiçbir şey yoktur. Ham veriler, yorumlamak istediğiniz türü seçer.
Welbog

3
@Suraj, tam cevap için ikinin tamamlayıcısı hakkındaki Wikipedia makalesine bakmanızı öneririm: en.wikipedia.org/wiki/Two%27s_complement . Kısa cevap MSB 1gösterir -8ve kalan üç 1s belirtmek 4, 2ve 1böylece sırasıyla -8+4+2+1 = -1.
Welbog

18

Wikipedia her şeyi söylüyor:

İkisinin tamamlayıcı sistemi, toplama ve çıkarma devrelerinin toplama veya çıkarma olup olmadığını belirlemek için işlenenlerin işaretlerini incelemesini gerektirmeme avantajına sahiptir. Bu özellik, sistemin hem uygulanmasını kolaylaştırır hem de daha yüksek hassasiyetli aritmetiği kolayca idare edebilir. Ayrıca, sıfırın tek bir temsili vardır ve bunların tamamlayıcı sistemlerde bulunan negatif sıfır ile ilişkili incelikleri ortadan kaldırır.

Başka bir deyişle, sayı negatif olsun veya olmasın ekleme aynıdır.


Efendim, char a = 12 yazarsam; ve işaretsiz char b = 12, altta yatan bit pıtırtısı aynı mı, gerçekten ne oluyor?
Suraj Jain

Yazarken veya okurken hiçbir şey değişmez. Sadece toplama veya çıkarma için geçerlidir.
Talespin_Kit

12

Bu soru eski olmasına rağmen, 2 sentimi girmeme izin verin.

Bunu açıklamadan önce, temel bilgilere dönelim. 2 'tamamlayıcısı 1'in tamamlayıcısı + 1'dir. Şimdi 1'in tamamlayıcısı nedir ve ek olarak önemi nedir.

Herhangi bir n-bit sayı ve 1'in tamamlayıcısı, bu n-bitlerle temsil edilebilecek mümkün olan en yüksek sayıyı verir. Misal:

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

Şimdi sonuca 1 tane daha eklemeye çalışırsak ne olacak. Taşmaya neden olur.

Sonuç 1 00000 olur (4 bit sayılarıyla çalışırken, soldaki 1 taşmadır)

Yani ,

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)

Birisi daha sonra 1'in tamamlayıcısı + 1'i 2 'tamamlayıcısı olarak adlandırmaya karar verdi. Böylece yukarıdaki ifade şöyle olur: Herhangi bir n'bit numarası + 2'sinin tamamlayıcısı = 0, 2'nin bir sayıyı tamamlaması anlamına gelir = - (bu sayının)

Bütün bunlar bir soru daha veriyor, neden pozitif sayıyı temsil etmek için n bitlerinin yalnızca (n-1) değerini kullanabiliriz ve en soldaki n. Bitin işareti (en soldaki bit + 0 ve 0 anlamına gelir) -ve sayı). Örneğin, 32. bit 1, -ve sayısı ise pozitif sayıyı temsil etmek için neden java içinde int'in sadece ilk 31 bitini kullanıyoruz?

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

1 0000 (sonuç sıfırdır, taşıma 1 taşar)

Böylece (n + 2 'n tamamlayıcısı) = 0 sistemi hala çalışır. Buradaki tek belirsizlik, 2'nin 12 tamamlayıcısıdır, 2's tamamlayıcı sisteminde -12'yi temsil etmekten başka, belirsiz bir şekilde +8'i temsil eden 0100'dür.

Pozitif sayıların her zaman en solda 0 olması durumunda bu sorun çözülecektir. Bu durumda, 2'lerinin tamamlayıcısı her zaman en solda 1'e sahip olacak ve bir 2'nin tamamlayıcı sayısını ve + ve sayısını temsil eden aynı bit kümesinin belirsizliğine sahip olmayacağız.


1
+ 1'lendi. Bu bir bilgiydi, ama nihayetinde niçin pozitif veya negatif bir sayı olduğunu göstermek için en önemli bit yaklaşımına sahip olmak istediğinizden emin değilim. 0 (2) - 0000 (+) ve 1000 (-) olmak üzere pek çok sorunu vardır .. Ayrıca toplama ve çıkarma aynı algoritma kullanılarak yapılamaz. Normal bir 0100 dediğinizde +8 ve ikisinin tamamlayıcısı 0100 dediğinizde -12 ..
hagrawal

8

İkisinin tamamlayıcısı , toplama ve çıkarma işlemlerinin normal şekilde yapılmasına izin verir (imzasız sayılar için yaraladığınız gibi). Ayrıca -0'ı da (sayıları karşılaştırmak için normal bit-bit yöntemi ile 0'a eşit olmayan 0'ı temsil etmenin ayrı bir yolu) önler.


6

bu sayıların toplamlarını ve farklılıklarını basitleştirmek içindir. negatif bir sayının ve 2'nin tamamlayıcılarında kodlanan pozitif bir sayının toplamı, onları normal şekilde toplamakla aynıdır.


5

Operasyonun olağan uygulaması "bitleri çevirin ve 1 ekleyin", ancak bunu tanımlamanın muhtemelen mantığı daha netleştiren başka bir yolu daha vardır. 2'nin tamamlayıcısı, her bitin 2'nin bir sonraki gücünü kontrol ettiği ve sadece en önemli terimi negatif yapan normal imzasız temsili alırsanız aldığınız formdur.

8 bitlik bir değer alma a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

Normal imzasız ikili yorumlama:
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

İkisinin tamamlayıcı yorumu:
-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

Diğer bitlerin hiçbiri anlamını değiştirmez ve 7'ye taşmak "taşmadır" ve çalışması beklenmez, bu nedenle hemen hemen tüm aritmetik işlemler modifikasyon olmadan çalışır (diğerleri belirttiği gibi). İşaret büyüklüğü genellikle işaret bitini inceler ve farklı mantık kullanır.


4

Two'nun tamamlayıcısı, negatif ve pozitif sayıların özel bir mantık olmadan birleştirilmesine izin verir.

Eğer 1 ve eklemek çalıştığında -1 senin yöntemi kullanılarak
10.000.001 (-1)
00000001 (1)
Alacağınız
çalıştıysanız 10000010 (-2) edersiniz

Bunun yerine, ikisinin tamamlayıcısını kullanarak,

11111111 (-1)
+00000001 (1) olsun
00000000 (0)

Aynı şey çıkarma için de geçerlidir.

Ayrıca, 4'ü 6'dan (iki pozitif sayı) çıkarmaya çalışırsanız, 2'nin tamamlayıcısı 4'ü ve ikisini birlikte ekleyebilirsiniz 6 + (-4) = 6 - 4 = 2

Bu, hem pozitif hem de negatif sayıların çıkarılması ve eklenmesinin, işlemci içindeki aynı devre tarafından yapılabileceği anlamına gelir.


4

Başkalarının cevaplarını genişletmek için:

İkinin tamamlayıcısı olarak

  • Toplama, düz pozitif tamsayıların eklenmesi ile aynı mekanizmadır.
  • Çıkarma da değişmez
  • Çarpma da!

Bölünme farklı bir mekanizma gerektirir.

Tüm bunlar doğrudur çünkü ikisinin tamamlayıcısı sadece normal modüler aritmetiktir, burada bazı sayılara modulo çıkararak negatif olarak bakmayı seçeriz.


Sadece genişlemeyen çarpma aynı değildir . Ancak çoğu üst düzey dil, açık oyuncular olmadan genişletme çarpımını desteklemediğinden, sonuç bu dillerde aynı olacaktır.
phuclv

@ LưuVĩnhPhúc: Genişletme çarpımı genellikle aynı olur, ancak imzalı ve imzasız çarpma sonuçlarının yalnızca sonuç imzalı bir int aralığına uyuyorsa aynı olacağı garanti edilir. Gcc gibi bazı derleyiciler unsigned mul(unsigned short x, unsigned short y) { return x*y; }[16-bit short; 32 bit int] zaman zaman ürün 2147483647'den büyükse arızalanacak kodu oluşturur.
supercat

2

Bu sorunun cevaplarını okurken, bu yoruma rastladım [düzenlendi].

2'nin 0100 (4) tamamlayıcısı 1100 olacaktır. Normal olarak söylersem 1100 şimdi 12 olur. Yani, normal 1100 dediğimde 12 olur, ama 2'nin 1100 tamamlayıcısı dediğimde -4? Ayrıca, Java'da 1100 (şimdilik 4 bit olduğunu varsayalım) saklanırsa, +12 veya -4 olup olmadığı nasıl belirlenir? - hagrawal 2 Temmuz, 16:53

Benim düşünceme göre, bu yorumda sorulan soru oldukça ilginç ve bu yüzden her şeyden önce onu yeniden ifade etmesini ve sonra bir cevap ve bir örnek vermesini istiyorum.

SORU - Sistem, bir veya daha fazla bitişik baytın nasıl yorumlanması gerektiğini nasıl belirleyebilir? Özellikle, sistem belirli bir bayt dizisinin düz bir ikili sayı mı yoksa 2'nin tamamlayıcı numarası mı olduğunu nasıl belirleyebilir?

CEVAP - Sistem, bir bayt dizisinin tipler yoluyla nasıl yorumlanacağını belirler. Türleri tanımlar

  • kaç bayt dikkate alınmalı
  • bu baytların nasıl yorumlanması gerektiği

ÖRNEK - Aşağıda varsayıyoruz

  • char1 bayt uzunluğunda
  • short2 bayt uzunluğunda
  • int's ve float' ler 4 bayt uzunluğunda

Bu boyutların sistemime özel olduğunu lütfen unutmayın. Oldukça yaygın olmasına rağmen, sistemden sisteme farklı olabilirler. Sisteminizde ne olduklarını merak ediyorsanız sizeof operatörünü kullanın .

Her şeyden önce 4 bayt içeren bir dizi tanımlarız ve hepsini 10111101onaltılı sayıya karşılık gelen ikili sayıya başlatırız BD.

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

Ardından dizi içeriğini farklı türler kullanarak okuruz.

unsigned char ve 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 ve 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, intvefloat

// 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 ) );

RAM'deki 4 bayt (l_Just4Bytes[ 0..3 ] ) her zaman aynı kalır. Değişen tek şey onları nasıl yorumladığımızdır.

Yine, biz sistemini anlatmak nasıl ile yorumlanması türleri .

Örneğin, yukarıda l_Just4Bytesdizinin içeriğini yorumlamak için aşağıdaki türleri kullandık

  • unsigned char: Düz ikili dosyada 1 bayt
  • signed char: 2 tamamlayıcıda 1 bayt
  • unsigned short: Düz ikili gösterimde 2 bayt
  • short: 2'nin tamamlayıcısında 2 bayt
  • unsigned int: Düz ikili gösterimde 4 bayt
  • int: 2 tamamlayıcıda 4 bayt
  • float: IEEE 754 tek kesinlikli gösterimde 4 bayt

[EDIT] Bu yayın, user4581301 tarafından yapılan yorumdan sonra düzenlendi. Bu yararlı satırları bırakmak için zaman ayırdığınız için teşekkür ederiz!


Bu kod blobunun bir düzenlemeye ihtiyacı vardır, böylece okuyucular ileri geri ilerlemeye devam etmek zorunda kalmazlar. Daha iyisi, üstteki bu büyük yorum düz eski metin olmalı ve oluşturucunun biçimlendirmeye dikkat etmesine izin vermelidir. Ayrıca, boyutlar ve biçimlendirmeyi tartıştığınız, boyutların sabit olmadığı için, uca yakın bite bir uyarı eklemeniz gerekir.
user4581301

+1. Yapmayı düşünebileceğiniz bir şey, @ mw215, bu soru / cevap çiftini kendi başına bir Topluluk Wiki girişi yapmaktır, çünkü ikinin tamamlayıcı matematiği dışında ham bayt yorumlamasıyla ilgilenebilecek insanlar için yararlıdır.
Welbog

Ben sadece 2 tamamlayıcı her zaman takip olduğunu bilmek istiyorum, yani ben varsa int x = -4, ve sonra printf("%d" , x)nasıl yorumlanır yapmak? Ayrıca unsigned intve signed intve arasındaki fark nedir %dve %u... bu uzun zamandır beni rahatsız ediyor.
Suraj Jain

@Suraj Jain intTürleri kullanırken , signeddeğiştirici varsayılan değerdir . Bu demektir ki intve signed inttam olarak aynı tiptedir. Böylece iki tanım int i = -4;ve signed int i = -4;aynı anlama sahiptir.
mw215

@Suraj Jain Sistem, bir bayt dizisini türler yoluyla nasıl yorumlayacağınızı belirler. Türler: kaç baytın dikkate alınması gerektiğini ve bu baytların nasıl yorumlanması gerektiğini tanımlar. Bir int4 bayt 2'nin tamamlayıcı ve unsigned int4 bayt düz ikili gösterimde (kullanarak sisteminizde gerçek tip boyutunu kontrol sizeofoperatörü).
mw215

1

Stanford'dan Profesör Jerry Cain'i, ikinci derste (2'nin tamamlayıcısıyla ilgili açıklama 13:00 civarında başlıyor) Stanford'un YouTube kanalından izleyebileceğiniz Programlama Paradigmaları adlı bir dizi konferansta ikisinin tamamlayıcısını açıklayan izleyebilirsiniz. Ders serisinin bağlantısı: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .


0

Devre tamamlanması daha basit olduğu için negatif bir sıfıra izin vermediği için ikisinin tamamlayıcısı kullanılır.

X bit varsa, ikisinin tamamlayıcısı + (2 ^ x / 2 + 1) ile - (2 ^ x / 2) arasında değişecektir. Kişinin tamamlayıcısı + (2 ^ x / 2) ile - (2 ^ x / 2) arasında çalışır, ancak negatif bir sıfıra izin verir (4 bit 1 tamamlayıcı sisteminde 0000 1000'e eşittir).


0

Amacınız, ikili sayınızın tüm bitlerini tersine çevirmek değildir. Aslında her basamağını 1'den çıkarmaktır. 1'den 1 çıkarmanın 0 ile sonuçlanması ve 0'dan 1'den 1 çıkarılması 1 sonucudur. Bu nedenle, çevirme bitleri etkili bir şekilde bu çıkartmayı gerçekleştirmektedir.

Ama neden her rakamın 1'den farkını buluyorsunuz? Sen değilsin. Gerçek amacınız, verilen ikili sayının, aynı sayıda basamağa sahip ancak sadece 1 içeren başka bir ikili sayıdan farkını hesaplamaktır. Örneğin, numaranız 10110001 ise, tüm bu bitleri çevirdiğinizde, etkili bir şekilde hesaplarsınız (11111111 - 10110001).

Bu, Two's Complement hesaplamasındaki ilk adımı açıklar. Şimdi ikinci adımı da ekleyelim - 1 ekleyerek - resimde de var.

Yukarıdaki ikili denkleme 1 ekleyin:

11111111-10110001 + 1

Siz ne alırsınız? Bu:

100000000-10110001

Bu son denklemdir. Ve bu iki adımı uygulayarak bunu bulmaya çalışıyorsunuz, son fark: en fazla bit biti hariç, ekstra bir rakamla başka bir ikili sayıdan çıkarılan ve sıfır içeren ikili sayı.

Ama neden bu farktan sonra gerçekten hankeriniz? Buradan, Wikipedia makalesini okursanız daha iyi olur sanırım .


0

Hem toplama hem de çıkarma için yalnızca toplama işlemi gerçekleştiriyoruz. Eklemek için ikinci işleneni birinci işlenene ekliyoruz. Çıkarma için ikinci işlenenin 2 tamamlayıcısını birinci işlenene ekliyoruz.

Bir 2'nin tamamlayıcı gösterimi ile çıkarma için ayrı dijital bileşenlere ihtiyacımız yoktur - yalnızca toplayıcılar ve tamamlayıcılar kullanılır.


0

Bazı erken ekleme makinelerinde, dijital bilgisayar günlerinden önce çıkarma işleminin, operatörün her bir tuşa farklı renkli bir efsane seti kullanarak değerler girmesini sağlayarak (her bir tuşun dokuz eksi sayı olacak özel bir düğmeye basmak hesaplamaya bir taşıma getireceğini varsayar. Böylece, altı basamaklı bir makinede, bir değerden 1234 çıkarmak için, operatör normalde "998,765" i belirten tuşlara basar ve devam eden hesaplamaya bu değeri artı bir eklemek için bir düğmeye basar. Two'nun tamamlayıcı aritmetiği, daha önceki “on tamamlayıcı” aritmetiğin ikili eşdeğeridir.


0

Tamamlayıcı yöntemle çıkarma yapmanın avantajı, donanım
karmaşıklığındaki azalmadır.Toplama ve çıkarma için farklı dijital devrelere gerek yoktur. Her iki toplama ve çıkarma sadece toplayıcı tarafından gerçekleştirilir.


0

Burada henüz bahsedilmeyen ikinin tamamlayıcı gösteriminin en büyük avantajı, ikinin tamamlayıcı toplamının, farkının veya ürününün alt bitlerinin yalnızca işlenenlerin karşılık gelen bitlerine bağlı olmasıdır. 8 bitlik değer için -1 nedeni 11111111çıkarılarak yani herhangi olan düşük 8 bit olan bir tam sayı 00000001olan en düşük 8 bit olan herhangi bir başka tamsayı . Matematiksel olarak, -1 değeri 1'lerden oluşan sonsuz bir dize olacaktır, ancak belirli bir tamsayı türü aralığındaki tüm değerler ya 1'lerin tümü veya 0'ın tümü belirli bir noktayı geçecektir, bu nedenle bilgisayarların bir sayının en önemli biti sonsuz sayıda 1 veya 0'ı temsil ediyormuş gibi.0000000 düşük 8 bit olan bir tamsayıyı verecektir11111111

İkili'nin tamamlayıcısı, ikili bir makinenin doğal kelime boyutundan daha büyük türlerle uğraşırken iyi çalışan tek işaretli sayı temsiliyle ilgilidir, çünkü toplama veya çıkarma yaparken, kod her bir işlenenin en düşük yığınını alabilir, en düşük yığınını hesaplayabilir sonucu saklayın ve ardından her bir işlenenin bir sonraki parçasını yükleyin, sonucun bir sonraki parçasını hesaplayın ve saklayın, vb. Böylece, tüm toplama ve çıkarma işlemlerinin tek bir 8 bitlik kayıttan geçmesini gerektiren bir işlemci bile. 32 bit işaretli sayıları makul şekilde verimli bir şekilde işleyebilir (32 bit kayıttan daha yavaş, ancak yine de uygulanabilir).

C Standardı tarafından izin verilen diğer imzalı sunumları kullanırken, sonucun her biti potansiyel olarak işlenenlerin herhangi bir bitinden etkilenebilir, bu da ya bir kerede kayıtlarda bir değerin tamamını tutmayı gerekli kılabilir ya da ekstra bir hesaplamaları takip edebilir. en azından bazı durumlarda, sonucun her bir parçasını okumak, değiştirmek ve yeniden yazmak için gerekli olan adım.


Lütfen Cevabınızı Biçimlendirin ve kodu kod olarak işaretleyin, daha okunabilir olur ve oyunuzu alırsınız.
Suraj Jain

@SurajJain: Daha iyi mi?
supercat

Evet, daha önce olduğundan daha iyi, size imzalı char a = 1 ve unsigned char a = 1 arasındaki farkın ne olduğunu sormak istiyorum, nasıl hafızada temsil ediliyorlar.
Suraj Jain

@SurajJain: "char" ın "int" [yani sistemlerin büyük çoğunluğu] 'dan daha küçük olduğu iki tamamlayıcı sistemlerde, imzalı ve imzasız karakter türleri, okunan ve imzasız türler olduğunda imzalı türlerin işaret uzatılması dışında aynı şekilde davranacaktır. alışkanlık. Böyle bir sistemde, 194 veya -62 değerini imzalı bir karaktere saklamak, 194 veya -62'yi imzasız bir karaktere (yani 11000010) depolamakla aynı bit desenini yazacaktır. İmzalı bir karakterden o bit desenini okumak -62 ve işaretsiz bir karakterden okumak 194 verecektir.
supercat

işaret genişletilmiş anlamına gelir?
Suraj Jain

0

Farklı temsil türleri vardır:

  1. imzasız numara gösterimi
  2. imzalı numara gösterimi
  3. tamamlayıcı temsil
  4. İkili'nin tamamlayıcı gösterimi

-Sadece pozitif sayıları temsil etmek için atanmamış numara gösterimi

-Onun yanı sıra negatif bir sayıyı temsil etmek için kullanılan işaretli sayı gösterimi. İmzalı sayı gösterimi MSB biti işaret bitini ve dinlenme bitleri sayıyı temsil eder. MSB 0 olduğunda sayı pozitif demektir ve MSB 1 olduğunda sayı negatif demektir.

İmzalı numara gösterimi ile ilgili sorun, 0 için iki değer olmasıdır.

Kişinin tamamlayıcı gösterimi ile ilgili problem, 0 için iki değer olmasıdır.

Ancak Two'nın kompleman temsilini kullanırsak, 0 için sadece bir değer olacaktır, bu yüzden ikisinin kompleman formunda negatif sayıları temsil ederiz.

Kaynak: Negatif sayılar neden ikinin tamamlayıcı formunda bytesofgigabayt olarak saklanır?


-1

Two2's Complement'ın One's Complement sisteminden ziyade negatif sayıları temsil etmek için neden kullanıldığına dair tatmin edici bir cevap, Two's Complement sisteminin 0'ın çoklu temsil problemini ve One'ın negatif temsil eden tamamlayıcı sisteminde mevcut olan taşıma sonu ihtiyacını çözmesidir. sayılar.

Daha fazla bilgi için https://en.wikipedia.org/wiki/Signed_number_representations adresini ziyaret edin.

Taşıma sonu için https://en.wikipedia.org/wiki/End-around_carry adresini ziyaret edin


aslında, ondalık bir noktanız varsa ve tüm bitlerin ne olduğu konusunda açıksanız: "0..0000.1111..1", en soldaki belirtilmemiş tüm bitlerin 0 ve en sağdaki belirtilmemiş tüm bitlerin 1 olduğu anlamına gelir. "..1", bir taşınmanın tetiklendiği anlamına gelir. Bu nedenle (mekanik olarak) "0.0001.0000..0" dır. "1..1111.1111..1" sıfıra eşit demektir! Bu aynı zamanda bir tamsayıyı reddetmek için, sadece bitlerini çevirdiğiniz anlamına gelir. Ancak şimdi temsili kesirler için geçerlidir.
Rob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.