Dyskusja:Liczby całkowite (zapis komputerowy)
Z Wikipedii
Przenoszę też na razie do dyskuji ten fragment hasła:
Do oznaczenia liczb ujemnych w tym zapisie można używać na przykład kodu "dopełnienia do dwóch". Oznacza to, że aby otrzymać liczbę ujemną o danej wartości bezwzględnej, należy zamienić wszystkie zera na jedynki i odwrotnie.
Przykład: wyznaczenie liczby -1 10 na ośmiu bitach wygląda tak:
- 1 10 = 0000 0001 2
- zamiana cyfr: 1111 1110 2
- dodajemy 1 i -1 10 = 1111 1111 2
bo nie rozumiem, jak zamiana cyfr w zapisie może zmienić znak liczby. W tych przekształceniach chodzi chyba o coś innego... IMHO -1 w systemie dziesiątkowym, ósemkowym a nawet dwójkowym nadal zapisuje się jako -1, zaś 11111111 w systemie dwójkowym odpowiada 255 w dziesiątkowym, a nie żadne -1.
Polimerek
Tak i nie. To, czy 1111 1111 oznacza 255 czy -1 zależy od przyjętej konwencji. Matusz 14:19, 5 gru 2002 (CET)
OK. Ale w takim razie trzeba jasno wyjaśnić o co chodzi w tej konwencji i jak odróżnić w takim razie że w jednym przypadku 11111111 to -1 a w innym 255...
Polimerek
Zazwyczaj jest to realizowane przez kompilator, przy użyciu na przykład rejestru flag (dla procesorów PC-towych), o ile wiem nie ma formalnego zapisu dla ludzi, oprócz kontekstu (na przykład umawiamy się, że mówimy o liczbach ze znakiem i wtedy mamy dostępne liczby ujemne, jak się umówimy, że chodzi o liczby bez znaku, to dostaniemy tylko dodatnie) Matusz 15:31, 5 gru 2002 (CET)
To wtedy ta "flaga" jest faktycznym zapisem znaku liczby, a konwencja odwracania zapisu jest po prostu z jakichś technicznych względów wygodna. Przecież komputer we wszelkich obliczeniach też musi "rozróżnić" 255 od -1. Z samymi liczbami jako takimi nie ma to jednak nic wspólnego. Liczba i jej sposób zapisu w maszynie to dwie osobe sprawy... Jeśli przyjąć, że 11111111 zawsze jest rozumiane przez komputer jako -1 to jak w takim razie zapisuje się w tej konwencji 255?
Hmmm, zdaje się, że za dużo na raz chciałem powiedzieć. Jest tak:
- Jest zapis matematyczny i zapis informatyczny. Zapis matematyczny jest potencjalnie nieograniczony, zapis dla komputerów z konieczności musi uwzględnić rozmiar komórki pamięci oraz wielkość całej pamięci - to wymusza pewne kompromisy.
- Tradycyjnie w nauczaniu o systemie dwójkowym w szkołach poniżej wyższych mowa jest wyłącznie o liczbach całkowitych nieujemnych.
- Istnieją różne możliwości rozszerzenia tego zapisu o liczby ujemne:
- można zapisywać najstarszy bit jako bit znaku, a całą resztę pozostawić jako odpowiednik liczby dodatniej
- można użyć dopełnienia do jedynki - prostej zamiany wszystkich bitów
- można użyć dopełnienia do dwójki - zamiana wszystkich bitów i dodanie jedynki jak do liczby bez znaku
- rejestr flag może oznaczać interpretację liczby jako 'ze znakiem' lub 'bez znaku', ale sama informacja o znaku konkretnej liczby jest zapisana w niej.
- oprócz tego wszystkiego, dla skomplikowania spraw istnieje cały zestaw sposobów zapisu liczb rzeczywistych (a właściwie pewnych ich podzbiorów).
- jak już pisałem jest to kwestia konwencji i technicznej konieczności, w kodzie C może to wyglądać tak:
unsigned short int ala = 255; /* w obliczeniach ma wartość 255 */ short int becia = 255; /* przy założeniu, że short int to jeden bajt dostaniemy ostrzeżenie o przypisaniu za dużej liczby dodatniej i wartość -1 */ unsigned short int cesia = -1; /* podobnie jak wyżej, lecz w obliczeniach ma wartość 255 */
- dla języka maszynowego istnieją oddzielne zestawy operacji dla interpretacji liczb ze znakiem i bez znaku (na przykład porównania mają zupełnie różne kody)
- obejrzyj sobie http://www.wikipedia.org/wiki/Integral_data_type rozdział "Representing integers"
Matusz 16:32, 5 gru 2002 (CET)