Zacznijmy od podsumowania prymitywnych typów danych Java:
bajt : typ danych Byte to 8-bitowa liczba całkowita uzupełniająca do dwóch ze znakiem .
Krótki : Krótki typ danych to 16-bitowa liczba całkowita uzupełniająca do dwóch ze znakiem .
int: Int to 32-bitowa liczba całkowita z dopełnieniem do dwóch ze znakiem .
long: typ danych Long to 64-bitowa liczba całkowita z dopełnieniem do dwóch ze znakiem .
float: typ danych Float to 32-bitowy zmiennoprzecinkowy IEEE 754 o pojedynczej precyzji .
double : double typ danych to 64-bitowy zmiennoprzecinkowy podwójnej precyzji IEEE 754 .
boolean: boolean typ danych reprezentuje jeden bit informacji .
char: char typ danych to pojedynczy 16-bitowy znak Unicode .
Źródło
Uzupełnienie dwóch
„Dobrym przykładem jest wiki, że związek z dopełnieniem do dwóch jest realizowany poprzez odnotowanie, że 256 = 255 + 1, a (255 - x) jest uzupełnieniem x
0000 0111 = 7 dopełnienia do dwóch to 1111 1001 = -7
działa to tak, że MSB (najbardziej znaczący bit) otrzymuje wartość ujemną, więc w powyższym przypadku
-7 = 1001 = -8 + 0+ 0+ 1
Dodatnie liczby całkowite są zwykle przechowywane jako proste liczby binarne (1 to 1, 10 to 2, 11 to 3 itd.).
Ujemne liczby całkowite są przechowywane jako uzupełnienie do dwóch wartości bezwzględnych. Uzupełnienie do dwóch liczby dodatniej jest w przypadku użycia tego zapisu jako liczby ujemnej.
Źródło
Ponieważ otrzymałem kilka punktów za tę odpowiedź, postanowiłem dodać do niej więcej informacji.
Bardziej szczegółowa odpowiedź:
Między innymi istnieją cztery główne podejścia do przedstawiania liczb dodatnich i ujemnych w systemie dwójkowym, a mianowicie:
- Podpisana wielkość
- Dopełnienie
- Dopełnienie do dwóch
- Stronniczość
1. Podpisana wielkość
Używa najbardziej znaczącego bitu do reprezentowania znaku, pozostałe bity są używane do reprezentowania wartości bezwzględnej. Gdzie 0 oznacza liczbę dodatnią, a 1 oznacza liczbę ujemną , na przykład:
1011 = -3
0011 = +3
Ta reprezentacja jest prostsza. Jednak nie można dodawać liczb binarnych w taki sam sposób, jak dodaje się liczby dziesiętne, co utrudnia implementację na poziomie sprzętu. Co więcej, to podejście wykorzystuje dwa wzorce binarne do reprezentowania 0, -0 (1000) i +0 (0000) .
2. Uzupełnienie
W tej reprezentacji odwracamy wszystkie bity danej liczby, aby znaleźć jej komplementarność. Na przykład:
010 = 2, so -2 = 101 (inverting all bits).
Problem z tą reprezentacją polega na tym, że nadal istnieją dwa wzorce bitowe reprezentujące 0, ujemne 0 (1000) i dodatnie 0 (0000)
3. Dopełnienie do dwóch
Aby znaleźć minus liczby, w tej reprezentacji odwracamy wszystkie bity, a następnie dodajemy jeden bit. Dodanie jednego bitu rozwiązuje problem posiadania dwóch wzorców bitowych reprezentujących 0. W tej reprezentacji mamy tylko jeden wzorzec dla
0 (0000) .
Na przykład, chcemy znaleźć binarną ujemną reprezentację 4 (dziesiętnie) za pomocą 4 bitów. Najpierw zamieniamy 4 na binarne:
4 = 0100
następnie odwracamy wszystkie bity
0100 -> 1011
na koniec dodajemy trochę
1011 + 1 = 1100.
Więc 1100 jest równoważne -4 dziesiętnie, jeśli używamy binarnej reprezentacji dopełnienia Two z 4 bitami.
Szybszym sposobem znalezienia komplementarnego jest ustalenie pierwszego bitu o wartości 1 i odwrócenie pozostałych bitów. W powyższym przykładzie byłoby to coś takiego:
0100 -> 1100
^^
||-(fixing this value)
|--(inverting this one)
Reprezentacja dopełnienia do dwóch, oprócz posiadania tylko jednej reprezentacji dla 0, dodaje również dwie wartości binarne w taki sam sposób, jak w liczbach dziesiętnych, parzystych z różnymi znakami. Niemniej jednak konieczne jest sprawdzenie przypadków przepełnienia.
4. Odchylenie
Ta reprezentacja jest używana do reprezentowania wykładnika w normie IEEE 754 dla zmiennoprzecinkowych. Ma tę zaletę, że wartość binarna ze wszystkimi bitami do zera reprezentuje najmniejszą wartość. A wartość binarna ze wszystkimi bitami do 1 reprezentuje największą wartość. Jak sama nazwa wskazuje, wartość jest kodowana (dodatnio lub ujemnie) binarnie z n bitami z odchyleniem (zwykle 2 ^ (n-1) lub 2 ^ (n-1) -1).
Więc jeśli używamy 8 bitów, wartość 1 w systemie dziesiętnym jest reprezentowana binarnie z odchyleniem 2 ^ (n-1), przez wartość:
+1 + bias = +1 + 2^(8-1) = 1 + 128 = 129
converting to binary
1000 0001
binary as is
podczas gdy -ve liczby są przechowywane wtwo's complement
?