Negatif işaretli değerler nasıl saklanır?


14

Bu videoyu işaretli tam sayıların maksimum ve minimum değerleri ile izliyordum .

Pozitif işaretli değere bir örnek alın - 0000 0001 İlk bit sayının pozitif olduğunu ve son 7 bitin sayının kendisidir. Böylece kolayca +1 olarak yorumlanır.

Şimdi negatif işaretli değere bir örnek verelim - 1000 0000, -8 olarak çıkıyor. Tamam, bilgisayar ilk bit nedeniyle negatif bir değer olduğunu anlayabilir, ancak 000 0000'ın -8 anlamına geldiğini nasıl anlıyor?

Genel olarak, negatif işaretli değerler bir bilgisayarda nasıl saklanır / yorumlanır?


nl.wikipedia.org/wiki/Two%27s_complement , ikili sayının bilgisayarlarda nasıl saklandığıdır.
Pieter B

@PieterB Belki bilgisayarınız. Ve diğer birçok insan. İyi sebeplerden dolayı! Ama tek yol olduğunu ima etme.
underscore_d

Herhangi bir şekilde. En az 256 düşünebilirim! (8 bit) ikili sayıları bilgisayarlarda saklama yolları. Ancak çoğu bu inanılmaz saçma.
Caleth

C belirtmez, çip üreticisinin verileri temsil etmeye büyük ölçüde karar verir. C, makine koduna derlenir ve çipin sayıları nasıl depoladığını yeniden tanımlamamaya özen gösterir. Kayan nokta sayıları için de aynı kurallar geçerlidir. Nasıl saklandıklarını tanımlamak çip üreticisine kalmış. Çoğu çip üreticisi 2'nin tamamlayıcısını kullanır, ancak eminim istisnalar vardır.
Berin Loritsch

Yanıtlar:


30

C standardı, negatif işaretli sayıları temsil etmenin özel bir yolunu zorunlu kılmaz.

Karşılaşabileceğiniz uygulamaların çoğunda, negatif işaretli tamsayılar ikisinin tamamlayıcısı olarak adlandırılır . Negatif işaretli sayıları depolamanın diğer önemli yoluna kişinin tamamlayıcısı denir .

İkisinin bir N-bit sayı tamamlayıcısı xolarak tanımlanır 2^N - x. Örneğin, 8-bit ikinin tamamlayıcısı 1olan 2^8 - 1veya 1111 1111. 8-bit ikinin tamamlayıcısı 8olan 2^8 - 8ikilik sistemde olan 1111 1000. Bu aynı zamanda uçları çevrilerek xve bir tane eklenerek de hesaplanabilir . Örneğin:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Kişinin bir N-bit sayısı x tamamlayıcısı, temel olarak tüm bitleri çevrilmiş olarak x olarak tanımlanır.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

İki kişinin tamamlayıcısı, kişinin tamamlayıcısı karşısında birkaç avantaja sahiptir. Örneğin, iyi bir nedenden dolayı birçok insan için kafa karıştırıcı olan 'negatif sıfır' kavramına sahip değildir. Toplama, çarpma ve çıkarma, ikisinin tamamlanmamış işaretli tamsayılarla aynı şekilde, imzalanmamış tamsayılarla olduğu gibi çalışır.


20

İkili dosyada negatif değerleri temsil etmek için iyi bilinen üç yöntem vardır:

  1. İmzalı büyüklük . Bu, anlaşılması en kolay olanıdır, çünkü negatif ondalık değerlerle uğraşırken alıştığımızla aynı şekilde çalışır: İlk konum (bit) işareti (pozitif için 0, negatif için 1) ve diğer bitler sayıyı temsil eder . Anlamak kolay olsa da, özellikle negatif sayılarla aritmetik yaparken bilgisayarların çalışması zordur.
    8-bit işaretli büyüklükte, 8 değeri 0 0001000 ve -8 ise 1 0001000 olarak temsil edilir.

  2. Tamamlayıcı . Bu gösterimde, negatif işaretler, yalnızca işaret bitini değil, tüm bitleri çevirerek karşılık gelen pozitif sayıdan oluşturulur. Bu, bir bilgisayar için negatif sayılarla çalışmayı kolaylaştırır, ancak +0 ve -0 için iki ayrı gösterim olması karmaşıklığına sahiptir. Tüm bitlerin çevrilmesi bunu insanlar için anlamayı zorlaştırır.
    8 bitlik bir tamamlayıcıda, 8 değeri 00001000 ve -8 olarak 11110111 olarak temsil edilir.

  3. İkinin tamamlayıcısı . Bu, günümüzde negatif tamsayılar için kullanılan en yaygın temsildir, çünkü bilgisayarlar için çalışmak en kolay olanıdır, ancak aynı zamanda insanlar için anlaşılması en zor olanıdır. Bir tamamlayıcı ve ikinin tamamlayıcısı arasındaki negatif değerler için kullanılan bit kalıpları karşılaştırıldığında, iki tamamlayıcıdaki aynı bit paterninin bir sonraki düşük sayı için kodladığı görülebilir. Örneğin, 11111111 kişinin tamamlayıcısında -0 ve ikinin tamamlayıcısında -1 ve benzer şekilde 10000000 (-127'ye karşı -128) anlamına gelir.
    8-bit ikisinin tamamlayıcısında, 8 değeri 00001000 ve -8 ise 11111000 olarak temsil edilir.


8
İşaretli büyüklüğün de iki sıfırı vardır.
Jörg W Mittag

İşaret / büyüklükten bahsetmek için +1. nadir ve rahatsız edici (CPU olmasa bile, insanlar için değil!), ama bilmeye değer.
underscore_d

Hemen hemen hepimiz özellikle FP rakamları ile işaretli büyüklükte çalışıyoruz.
Paulo1205

2

İmzalı tam sayılar http://en.wikipedia.org/wiki/Two%27s%20complement kullanılarak saklanır

Sonra alırsınız:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

Temel olarak saymak çok kolay, işaretli tamsayının yarısına kadar sayıyorsunuz. +1 yapın, negatif yapın ve geri saymaya başlayın.

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.