Minimum ints, double, vs 1 değeri sıfırdan neden pozitif değerden daha uzundur?


10

Ben 2 tamamlayıcı ve 1 ekleyerek bir şey olduğunu biliyorum, ama negatif sayılar söz konusu olduğunda aynı miktarda bit ile bir sayı daha kodlamak nasıl gerçekten anlamıyorum.


3
Bunun gerçekten kötü tarafı Abs (MinValue) 'nun negatif olmasıdır.
OldFart

1
Java_MIN_VALUE en küçük pozitif değerdir ve sıfırdan en uzak (gerçek) sayılar eşit büyüklüğe sahiptir (uygun bir işaret bitine sahip olduğu için)
cırcır ucubesi

Yanıtlar:


16

Bu terimlerle düşünün. Önceden işaretli 2 bitlik bir sayı alın:

000 = 0
001 = 1
010 = 2
011 = 3

Şimdi bazı olumsuzluklarımız var:

111 = -1
110 = -2
101 = -3

Bekle, bizde var

100 ... 

Olumsuz olması gerekir, çünkü işaret 1 1'dir. Yani mantıklı olarak -4 olmalıdır.

(Düzenleme: WorldEngineer'ın haklı olarak işaret ettiği gibi , tüm numaralandırma sistemleri bu şekilde çalışmaz - ancak sorduğunuzlar bunu yapar.)


11

Çünkü tamsayı aralığında iki sayı sınıfı yok, ancak üç: negatif sayılar, sıfır ve pozitif sayılar. Sıfırın bir yuva alması gerekir (sıfırı temsil edememek oldukça pratik olmaz ...), bu yüzden pozitif veya negatif sınıf bir yuvadan vazgeçmelidir. Genellikle bu fedakarlığı yapmak zorunda olan pozitif menzilin bir dereceye kadar keyfi olması, ancak bit manipülasyonları seviyesinde bu kararın daha uygun hale getirdiği bazı şeyler vardır.


Sadece biraz manipülasyon değil. 32-bit işaretli sayılar kümesi, ikili gösterimi 31.'den sonra tüm bitlerde aynı değere sahip olan ve bu tür bir sayının sonsuz sayıda ve ardından 31 sıfır olan sayı kümesidir. Bu sayının tersi, sonsuz bir sıfır dizisi ve ardından tek bir 1 ve 31 sıfır, izlenen değerlerin gerektirdiği desene uymuyor.
supercat

4

İkili olarak işaretli tam sayıları temsil etmenin TEMEL üç yolu vardır: 2'nin tamamlayıcısı, 1'in tamamlayıcısı ve işaret büyüklüğü. (Biquinary uzun zaman önce Dodo Bird'ün yolunu tuttu.)

1'in tamamlayıcısı ve işaret büyüklüğü, her biri benzersiz bir temsile sahip iki sıfır değere sahiptir, +0 ve -0. 2'nin tamamlayıcısı sadece bir sıfır değerine ve bir gösterime sahiptir.

Şimdi, N bit alanı 2 ^ N değerini kodlayabilir. 2 tamamlayıcıdan birini çıkarın ve 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1'iniz var. Sıfır temsili sıfır bit olduğundan ve + işareti sıfır olduğundan, işaret biti 1 olarak ayarlanmış bir olası sıfır olmayan gösterim daha olacaktır.

Bu, 2'nin tamamlayıcısının - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1) değerlerini temsil ettiğini söylemenin çok uzun bir yoludur.

Tamsayı dijital sinyal işleme hesaplamaları yapıyorsanız, 1'in tamamlayıcısı aslında 2'nin tamamlayıcısı üzerinde bir avantaja sahiptir. 1'in tamamlayıcı işlemleri doğal olarak sıfıra doğru kısalır. 2'nin tamamlayıcısı -finity'e doğru kesilir. Bunu ZOR bir şekilde öğrendim ...

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.