Ben gördüğüm en açıklamalardan gibi, yukarıda olanlar 2'nin tamamlayıcı ile çalışma hakkında açık ve net ama gerçekten ne anlatmak değil vardır matematiksel olarak. Bunu en azından tamsayılar için yapmaya çalışacağım ve muhtemelen önce tanıdık olan bir arka plan ele alacağım.
Ondalık için nasıl çalıştığını hatırlayın:
2345
,
2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 yazmanın bir yoludur .
Aynı şekilde, ikili, aynı genel fikri izleyerek sadece 0 ve 1 kullanarak sayı yazmanın bir yoludur , ancak yukarıdaki 10'ları 2'lerle değiştirir. Sonra ikili,
1111
,
1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 yazmanın bir yoludur
ve eğer çalışırsanız, bu 15'e eşittir (taban 10). Çünkü
8 + 4 + 2 + 1 = 15.
Her şey iyi ve pozitif sayılar için iyi. İnsanların ondalık sayılarla yaptığı gibi, önlerine bir eksi işareti yapıştırmak istiyorsanız, negatif sayılar için bile çalışır. Bu bilgisayarlarda bile yapılabilir, ancak 1970'lerin başından beri böyle bir bilgisayar görmedim. Farklı bir tartışmanın nedenlerini bırakacağım.
Bilgisayarlar için negatif sayılar için bir tamamlayıcı gösterim kullanmak daha verimli olur . Ve işte çoğu zaman gözden kaçan bir şey. Tamamlayıcı gösterimler, sayının basamaklarının bir tür tersine çevrilmesini, hatta normal bir pozitif sayıdan önce gelen zımni sıfırları içerir. Bu garip, çünkü soru ortaya çıkıyor: hepsi mi? Dikkate alınması gereken sonsuz sayıda basamak olabilir.
Neyse ki, bilgisayarlar sonsuzluğu temsil etmiyor. Sayılar belirli bir uzunlukla sınırlıdır (veya isterseniz genişlikle). Öyleyse pozitif ikili sayılara dönelim, ancak belirli bir boyutta. Bu örnekler için 8 basamak ("bit") kullanacağım. Yani ikili sayımız gerçekten
00001111
veya
0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
2'nin tamamlayıcı negatifini oluşturmak için, önce tüm (ikili) rakamları
11110000 oluşturmak için tamamlar
ve 11110001'i oluşturmak için 1
ekleriz,
ancak bunu -15 anlamına nasıl anlarız?
Cevap, yüksek dereceli bitin (en soldaki) anlamını değiştirmemizdir. Bu bit, tüm negatif sayılar için 1 olacaktır . Değişiklik, görünen numarayı değerine katkısının işaretini değiştirmek olacaktır Yani şimdi bizim. 11110001 temsil ettiği anlaşılmaktadır
- 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Bu ifadenin önünde "-" olduğuna dikkat edin? İşaret bitinin -2 -7 , yani -128 (taban 10) ağırlığını taşıdığı anlamına gelir . Diğer tüm pozisyonlar işaretsiz ikili sayılardaki ağırlıklarını korurlar.
-15 ile çalışırken,
-128 + 64 + 32 + 16 + 1
hesap makinenizde deneyin. -15.
Bilgisayarlarda temsil edilen negatif sayıları gördüğüm üç ana yoldan, 2'nin tamamlayıcısı genel kullanım kolaylığı için eller kazanır. Yine de tuhaflığı var. İkili olduğu için, çift sayıda olası bit kombinasyonu olmalıdır. Her pozitif sayı negatif ile eşleştirilebilir, ancak yalnızca bir sıfır vardır. Bir sıfırı reddetmek sıfırı alır. Yani bir daha kombinasyonu ile numara var 1 işaret biti ve 0 başka her yerde. Karşılık gelen pozitif sayı, kullanılan bit sayısına uymayacaktır.
Bu sayı hakkında daha da garip olan şey, bir tamamlayıcıyı ekleyerek pozitif oluşturmaya çalışırsanız, aynı negatif sayıyı geri alırsınız. Sıfırın bunu yapması doğal görünmektedir, ancak bu beklenmedik bir durumdur ve alıştığımız davranış hiç de değildir, çünkü bilgisayarlar bir yana, genellikle bu sabit uzunluklu aritmetik değil, sınırsız sayıda rakam kaynağı düşünüyoruz.
Bu tuhaflıkların bir buzdağının ucu gibidir. Yüzeyin altında daha fazla beklemek var, ama bu tartışma için bu yeterli. Eğer sabit nokta aritmetiği için "taşma" araştırırsanız muhtemelen daha fazla bulabilirsiniz. Gerçekten içine girmek istiyorsanız, "modüler aritmetik" de araştırma yapabilirsiniz.