2013-09-01 24 views
13

Dlaczego zakres dowolnego typu danych jest większy po stronie ujemnej w porównaniu do strony dodatniej?Dlaczego zakres int wynosi od -32768 do 32767?

Na przykład, w przypadku całkowitej:

W Turbo C jej zakres jest -32768 do 32767 i Visual Studio jest -2147483648 do 2147483647.

To samo dzieje się z innymi typami danych ...

[UPD: Ustaw odpowiednie wartości graniczne dla Visual Studio]

+4

Gdzie umieścić zero? – Shomz

+16

http://pl.wikipedia.org/wiki/Two's_complement –

+0

Ponieważ musisz zapisać także 0! – GC268DM

Odpowiedz

31

Ponieważ, jak numer przechowywane są podpisane liczb przechowywanych z wykorzystaniem co nazywa "notacja uzupełnienia dwójki":

Pamiętaj, że wszystkie zmienne mają określoną liczbę bitów.Jeśli najważniejszy z nich, ten po lewej, to 0, wtedy liczba jest nieujemna (tzn. zero), a reszta bitów po prostu reprezentuje wartość:

Jednak, jeśli lewy lewy bit jest równy 1, liczba jest ujemna, rzeczywistą wartość liczby można uzyskać przez subtrac ting 2^n z całej reprezentowanej liczby (jako liczba niepodpisana, w tym najdalsza od lewej 1), gdzie n to ilość bitów, które ma zmienna.

Ponieważ pozostało tylko n-1 bitów dla rzeczywistej wartości ("mantysa") liczby, możliwe są kombinacje 2^(n - 1). Dla liczb dodatnich/zero jest to łatwe: idą od 0, do 2^(n - 1) - 1. To -1 oznacza samo zero - na przykład, jeśli masz tylko cztery możliwe kombinacje, te kombinacje reprezentowałby 0, 1, 2 i 3 (zauważ, jak są cztery liczby): od 0 do 4 - 1.

Dla liczb ujemnych pamiętaj, że lewy skrajny bit to 1, więc cała reprezentowana liczba mieści się między 2^(n - 1) i (2^n) - 1 (nawiasy są tam bardzo ważne!). Jednak, jak już powiedziałem, musisz wziąć 2^n, aby uzyskać prawdziwą wartość liczby. 2^(n - 1) - 2^n to - (2^(n - 1)) i ((2^n) - 1) - 2^n wynosi -1. Dlatego zakres liczb ujemnych wynosi - (2^(n - 1)) do -1.

Połóż to wszystko razem i otrzymasz -2^(n - 1) do 2^(n - 1) - 1. Jak widzisz, górna granica otrzymuje wartość -1, której dolna granica nie ma.

I dlatego jest jeszcze jedna liczba ujemna niż dodatnia.

0

Z 2s uzupełnienia liczby ujemne są zdefiniowane jako bitowego nie zmniejsza Plus 1 zakres możliwych liczb w danej liczbie bitów o 1 po stronie ujemnej.

0

Ponieważ zakres obejmuje zero. Liczba różnych wartości, które może reprezentować n-bitowa liczba całkowita, wynosi 2^n. Oznacza to, że 16-bitowa liczba całkowita może reprezentować 65536 różnych wartości. Jeśli jest to 16-bitowa liczba całkowita bez znaku, może reprezentować 0-65535 (włącznie). Konwencja dotycząca liczb całkowitych ze znakiem jest reprezentowana od -32768 do 32767, -214748368 do 214748367, itp.

+0

Dlaczego ktoś mógłby zgodzić się z tą odpowiedzią? ? Może to nie być najbardziej kompletna i najbardziej szczegółowa odpowiedź, ale jest całkowicie * poprawna *. –

0

Zwykle, z powodu użycia układu uzupełniania dwójkowego do przechowywania wartości ujemnych, po odwróceniu bitu znaku na liczbę całkowitą jest on stronniczy w kierunku Negatyw.

zakres powinien być: -. (2^(n-1)) - ((2^(n-1) -1)

14

Minimalny zakres wymagany przez C wynosi od -32767 do 32767, ponieważ musi uwzględniać uzupełnienie dwójkowe, uzupełnienie i kodowanie znaku/magii liczb ujemnych, z których wszystkie pozwalają na to standardy C. Zobacz Annex E, Implementation limits dla C11 (i C99), aby uzyskać szczegółowe informacje na temat minimalnych zakresów typów danych.

Twoje pytanie dotyczy tylko wariantu uzupełnienia dwójki, a przyczyna tego jest prosta. 16 bitów może reprezentować różne wartości, a zero musi być jednym z nich. Stąd istnieje nieparzysta liczba wartości w lewo, z których większość (o jeden) są wartości ujemne:

1 thru 32767 = 37267 values 
0    =  1 value 
-1 thru -32768 = 32768 values 
        ----- 
        65536 values 

uzupełnieniem zarówno ones' i znak-wielkość kodowania pozwala na negatywną-zerowej wartości (jak również pozytywne -zero), co oznacza, że ​​jeden mniej bitowy wzorzec jest dostępny dla niezerowych liczb, stąd zredukowany minimalny zakres znaleziony w standardzie.

1 thru 32767 = 37267 values 
0    =  1 value 
-0    =  1 value 
-1 thru -32767 = 32767 values 
        ----- 
        65536 values 

Uzupełnienie dwóch osób jest w rzeczywistości świetnym schematem kodowania, ponieważ liczby dodatnie i ujemne można dodać razem z tym samym prostym sprzętem. Inne schematy kodowania zwykle wymagają bardziej skomplikowanego sprzętu do wykonania tego samego zadania.

Aby uzyskać pełniejsze wyjaśnienie na temat działania uzupełnienia dwójkowego, patrz: wikipedia page.