Ücretsiz oyna

Aritmetik

İkiye tümleyen: bilgisayarlar negatif sayıları nasıl saklar

Bir baytta eksi işareti yok. İkiye tümleyen (2’ye tümleyen ya da ikinin tümleyeni diye de geçer), sekiz sade bitin −128 ile 127 arasını temsil etmesini sağlayan numara. Öyle iyi çalışıyor ki aynı toplayıcı devresi pozitif ve negatif sayıları farkında bile olmadan işliyor.

3 dk okuma · Güncellendi

Tek cümlelik özet

8 bitlik bir ikiye tümleyen sayıda en soldaki bit +128 değil, −128 değerindedir. Diğer bütün bitler alışılmış pozitif ağırlıklarını korur (64, 32, 16, 8, 4, 2, 1). Tanımın tamamı bu. Geri kalan her şey buradan çıkıyor.

−1286432168421
işaretsiz 251işaretli -5onaltılık FB
Bitlere tıkla. En soldaki bit −128 değerinde, yani 11111011 = −128 + 64 + 32 + 16 + 8 + 2 + 1 = −5. Aynı sekiz bit işaretsiz sayı olarak okunursa 251 eder.

İkiye tümleyen bir sayıyı okumak

1 olan bitlerin ağırlıklarını topla; en üsttekinin negatif olduğunu unutma:

En üst bit 0 ise sayı sıfır ya da pozitiftir ve tıpkı sıradan bir işaretsiz sayı gibi okunur. En üst bit 1 ise sayı negatiftir. Bu yüzden en üst bite çoğu zaman işaret biti denir; ama gerçek bir eksi işaretinden farklı olarak bir ağırlığı vardır ve hesaba katılır.

Kilometre sayacı benzetmesi

Başka bir bakış açısı: 8 bitlik bir yazmaç, 255’ten sonra başa dönen bir sayaçtır; tıpkı 99999’dan 00000’a dönen bir arabanın kilometre sayacı gibi. 0’dan geriye say: önce 255’e, sonra 254’e, sonra 253’e varırsın. İkiye tümleyen bu değerlere sadece −1, −2 ve −3 demeyi kabul eder. Negatif bir −x sayısı 256 − x olarak saklanır.

Sıradan toplamayla çalışmasının nedeni bu. 8 bitlik bir yazmaçtaki sayıya 256 eklemek hiçbir şeyi değiştirmez, çünkü fazladan 1 tepeden düşer. Yani 256 − x eklemek, x çıkarmakla aynı şey. Dene: 7 + (−5), 00000111 + 11111011 = 1 00000010. Dokuzuncu biti at; cevap 2.

Aralık

Bitİşaretsiz aralıkİkiye tümleyen aralığı
40 … 15−8 … 7
80 … 255−128 … 127
160 … 65.535−32.768 … 32.767
320 … 4.294.967.295−2.147.483.648 … 2.147.483.647

Negatif sayılar pozitiflerden bir fazladır, çünkü “negatif olmayan” desenlerden birini sıfır kaplar. Bunun ilginç bir sonucu var: bir baytta −128’in negatifini alırsan yine −128 elde edersin, çünkü +128 sığmaz.

Neden düz bir işaret biti kullanılmıyor?

Akla ilk gelen fikir olan işaret-büyüklük (sign-magnitude) gösterimi, tıpkı kâğıtta yaptığımız gibi bir biti işarete, kalanları büyüklüğe ayırır. Bazı erken bilgisayarlar bunu kullandı; bazıları da negatif almanın bütün bitleri ters çevirmek demek olduğu bire tümleyeni kullandı. İkisinde de iki ayrı sıfır vardır (+0 ve −0) ve ikisi de negatif bir sayı eklendiğinde doğru cevabın çıkması için ek mantık ister. İkiye tümleyende tek bir sıfır vardır ve düz ikili toplayıcı zaten doğru şeyi yapar. Donanımdaki bu tasarruf yüzünden 1970’lerden beri yapılan neredeyse her işlemci onu kullanır. Başlıca istisna kayan noktalı sayılar: onlar ayrı bir işaret biti tutar.

Elle dönüştürme

Negatif bir −x sayısını n bitle yazmak için 2n − x’i hesapla ve onu ikili olarak yaz. 8 bitte −5 için: 256 − 5 = 251 = 11111011. Ters yönde gitmek için sayıyı, yukarıdaki gibi en üst biti −2n−1 değerinde sayarak oku. İki yöntem de doğrudan tanımdan çıkar ve her zaman işe yarar.

Oyundaki negatif alma bulmacası için spoiler: kestirme yol

Negatif almanın çıkarma gerektirmeyen, bilinen bir kestirmesi var: bütün bitleri ters çevir, sonra 1 ekle. 5 için: 00000101 → 11111010 → 11111011, yani −5. İşe yarar, çünkü bir sayıyla bitleri ters çevrilmiş ikizinin toplamı her zaman 11111111, yani −1’dir. Oyun senden bir negatif alma devresi kurmanı istiyor; fikri kendin bulmak istiyorsan bu kutuyu atla.

Taşma

İşaretli bir baytta 100 + 100 yap: 11001000 çıkar, bu da −56 diye okunur. Gerçek cevap olan 200 aralığın dışında, yani taşma oldu. Ele veren işaret şu: aynı işaretli iki sayı, ters işaretli bir sonuç üretti. İşlemciler bunu, işaretsiz sayılar için kullanılan elde bayrağından ayrı bir taşma bayrağına (overflow flag) kaydeder. Toplayıcı her iki durumda da aynı bitleri üretir; bunları işaretli mi işaretsiz mi sayacağı programın tercihidir. Birçok komut kümesinde iki ayrı karşılaştırma ve dallanma komutu takımı olmasının nedeni bu.

İşaret genişletme

İşaretli bir sayıyı genişletmek için, örneğin 8 bitten 16 bite, işaret bitini bütün yeni bitlere kopyala. −5 bir bayt olarak 11111011, 16 bitlik bir sözcük olarak ise 11111111 11111011’dir. Pozitif bir sayı da beklediğin gibi sıfırlarla doldurulur. Baytları daha geniş yazmaçlara yükleyen komut kümeleri genellikle tam da bu yüzden “işaretli yükle” ve “işaretsiz yükle” diye iki çeşit sunar.