Oglądałem ten film na maksymalnych i minimalnych wartościach liczb całkowitych ze znakiem.
Weźmy przykład dodatniej wartości ze znakiem - 0000 0001 Pierwszy bit oznacza, że liczba jest dodatnia, a ostatnie 7 bitów to sama liczba. Można to łatwo zinterpretować jako +1.
Teraz weźmy przykład ujemnej wartości ze znakiem - 1000 0000, która wychodzi na -8. Ok, komputer może zrozumieć, że jest to wartość ujemna z powodu pierwszego bitu, ale jak, do diabła, rozumie, że 000 0000 oznacza -8?
Ogólnie, w jaki sposób przechowywane / interpretowane na komputerze wartości ze znakiem ujemnym są przechowywane?
c
memory
bitwise-operators
bit
dyskutowane drzewo
źródło
źródło
Odpowiedzi:
Standard C nie nakazuje żadnego konkretnego sposobu reprezentowania liczb ujemnych.
W większości implementacji, które mogą wystąpić, liczby całkowite ze znakiem ujemnym są przechowywane w tak zwanym uzupełnieniu do dwóch . Innym ważnym sposobem przechowywania liczb ujemnych jest uzupełnienie .
Uzupełnienie dwóch liczb N-bitowych
x
jest zdefiniowane jako2^N - x
. Na przykład, uzupełnieniem dwójki 8-bit1
jest2^8 - 1
, lub1111 1111
. Uzupełnienie dwóch 8-bitowych8
to2^8 - 8
, co jest w formacie binarnym1111 1000
. Można to również obliczyć, odwracając bityx
i dodając jeden. Na przykład:Uzupełnienie jednej liczby N-bitowej x jest zdefiniowane jako x, a wszystkie bity są odwrócone.
Uzupełnienie dwóch ma kilka zalet w stosunku do uzupełnienia jednego. Na przykład nie ma pojęcia „ujemnego zera”, co z wielu powodów jest mylące dla wielu osób. Dodawanie, mnożenie i odejmowanie działają tak samo z podpisanymi liczbami całkowitymi zaimplementowanymi z uzupełnieniem do dwóch, podobnie jak w przypadku liczb całkowitych bez znaku.
źródło
Istnieją trzy dobrze znane metody reprezentowania wartości ujemnych w formacie binarnym:
Podpisana wielkość . Jest to najłatwiejszy do zrozumienia, ponieważ działa tak samo jak do tej pory, gdy mamy do czynienia z ujemnymi wartościami dziesiętnymi: pierwsza pozycja (bit) reprezentuje znak (0 dla wartości dodatniej, 1 dla wartości ujemnej), a pozostałe bity reprezentują liczbę . Chociaż łatwo jest nam to zrozumieć, trudno jest pracować z komputerami, zwłaszcza gdy wykonujemy arytmetykę z liczbami ujemnymi.
W 8-bitowej wielkości ze znakiem wartość 8 jest reprezentowana jako 0 0001000, a -8 jako 1 0001000.
Uzupełnienie . W tej reprezentacji liczby ujemne są tworzone z odpowiedniej liczby dodatniej przez odwrócenie wszystkich bitów, a nie tylko bitu znakowego. Ułatwia to pracę z liczbami ujemnymi dla komputera, ale ma tę komplikację, że istnieją dwie różne reprezentacje dla +0 i -0. Przerzucanie wszystkich bitów sprawia, że jest to trudniejsze do zrozumienia dla ludzi.
W uzupełnieniu 8-bitowym wartość 8 jest reprezentowana jako 00001000, a -8 jako 11110111.
Uzupełnienie dwóch . Jest to najczęstsza reprezentacja stosowana obecnie w przypadku liczb całkowitych ujemnych, ponieważ jest najłatwiejsza do pracy z komputerami, ale jest również najtrudniejsza do zrozumienia dla ludzi. Porównując wzorce bitów stosowane dla wartości ujemnych między uzupełnieniem jednego i drugiego, można zaobserwować, że ten sam wzór bitowy w uzupełnieniu dwóch koduje kolejną niższą liczbę. Na przykład 11111111 oznacza -0 w uzupełnieniu jednego i -1 w uzupełnieniu dwóch i podobnie dla 10000000 (-127 vs -128).
W uzupełnieniu 8-bitowych dwóch wartość 8 jest reprezentowana jako 00001000, a -8 jako 11111000.
źródło
Podpisane liczby całkowite są przechowywane przy użyciu http://en.wikipedia.org/wiki/Two%27s%20complement
Następnie otrzymujesz:
Zasadniczo jest to bardzo łatwe liczenie, liczysz do połowy maksymalnej liczby całkowitej ze znakiem. Zrób +1, uczyń go ujemnym i zacznij odliczać.
źródło