Liczba całkowita (typ danych)
Liczby całkowite – typ danych dotyczący liczb całkowitych. Liczby te mogą zostać zapisane w pamięci komputera w rozmaity sposób. Obecnie dla liczb naturalnych najczęściej spotykany jest pozycyjny dwójkowy system liczbowy. Inne znane sposoby zapisu to kod Graya i BCD.
Reprezentacja liczby w kodzie binarnym
edytujGrupowanie informacji
edytujNa pamięć komputera można spojrzeć jak na komórki. W każdej z nich trzymany jest elementarny kwant informacji zwany bitem. W praktyce komórki te grupuje się w większe całości zwane, w zależności od rozmiaru, bajtami (8 bitów), słowami (zawierającymi 2 lub więcej bajtów) lub jeszcze inaczej.
Kolejność bitów w bajtach, bajtów w słowach itp. może być ustalona na dwa podstawowe sposoby:
- little endian – „najmłodszy” bit/bajt na początku, tzn. pod najniższym adresem, „najstarszy” bit/bajt na końcu.
- big endian – na odwrót
Sposoby zapisu liczb ujemnych
edytujDowolny sposób zapisu liczb ze znakiem wymaga co najmniej jednego dodatkowego bitu – bitu znaku. Zazwyczaj używa się najstarszego bitu dla danego rozmiaru komórki pamięci.
Najbardziej naturalnym dla człowieka sposobem uwzględnienia znaku jest potraktowanie najstarszego bitu jako bitu znaku, a pozostałych bitów jako wartości bezwzględnej liczby (zapis znak-moduł). Przykład (zapis pozycyjny na czterech bitach):
- 01012 to 510
- 11012 to −510
W tym zapisie zero można przedstawić na dwa sposoby: kasując wszystkie bity oraz ustawiając jedynie bit znaku.
„Dopełnienie do jedynki” polega na odwróceniu wszystkich bitów odpowiedniej liczby dodatniej. Przykład:
- 01012 to 510
- 10102 to −510
Również w tym zapisie zero można przedstawić na dwa sposoby: jako komórkę o wszystkich bitach ustawionych lub o wszystkich bitach wyzerowanych. Dopełnienie do jedynki jest używane w maszynach PDP-1 i UNIVAC 1100.
Najczęściej używanym (zwłaszcza w komputerach osobistych) jest zapis „dopełnienia do dwóch”. Zmiana znaku polega w nim na odwróceniu wszystkich bitów liczby wyjściowej i dodaniu jedynki – w tej operacji pośredniej liczba jest zawsze traktowana jakby była dodatnia. Okazuje się, że najstarszy bit można zinterpretować jako bit znaku. Przykład:
- 01012 to 510
- 10112 to −510
Ten zapis pozwala uniknąć niejednoznacznej postaci zera (kosztem niesymetryczności zakresu reprezentowanych liczb) oraz ułatwia dodawanie. Dodawanie w tym zapisie nie różni się niczym od dodawania liczb binarnych bez znaku. Wystąpienie dokładnie jednego z przeniesień: z najstarszego bitu (bitu znaku) i na najstarszy bit świadczy o przekroczeniu dopuszczalnego zakresu (o nadmiarze).
Liczby całkowite w językach programowania
edytuj- Typy danych całkowitych w językach C, C++: short int, int, long int, long long int (w wersjach signed i unsigned)
- Typy danych całkowitych w Pascalu: ShortInt, Integer, LongInt, longassInt
Liczby całkowite w C, C++
edytujW C, C++ zdefiniowano 8 typów danych przeznaczonych do reprezentacji liczb całkowitych – są to short int, int, long int, long long int w wersjach ze znakiem (signed) oraz bez znaku (unsigned). Ich rozmiary w bitach zależą od implementacji. Standard C99 określa następujące zależności pomiędzy typami:
- int ma minimum 16 bitów
- long int jest co najmniej takiego rozmiaru, co int
- long long int ma minimum 64 bity
W praktyce współczesne kompilatory (takie jak GCC) na maszynach 32-bitowych zazwyczaj stosują typy o następujących rozmiarach:
- short int ma 16 bitów
- int jest równy long int i ma 32 bity
- long long int ma 64 bity
Typem całkowitym o rozmiarze 8 bitów w praktyce jest także typ znakowy char.
Przykładowe zakresy liczb całkowitych możliwych do przedstawienia za pomocą danego typu (w przypadku GCC 3.3.5 dla systemu 32-bitowego) przedstawia poniższa tabela:
liczba bitów | nazwa | zakres |
---|---|---|
8 | char | −128 — +127 (ze znakiem) 0 — +255 (bez znaku) |
16 | short int | −32 768 — +32 767 (ze znakiem) 0 — +65 535 (bez znaku) |
32 | int, long int | −2 147 483 648 — +2 147 483 647 (ze znakiem) 0 — +4 294 967 295 (bez znaku) |
64 | long long int | −9 223 372 036 854 775 808 — +9 223 372 036 854 775 807 (ze znakiem) 0 — +18 446 744 073 709 551 615 (bez znaku) |