02.05.2016, 16:58:34
Wykład 5: U2
Wbrew oczekiwaniom tematem dzisiejszego wykładu nie będzie historia zespołu U2.
Jak pamiętacie z poprzednich wykładów na liczbach binarnych da się zapisać liczby naturalne.
W zastosowaniach operowanie takimi tylko liczbami stwarza duże problemy. Na przykład chcielibyśmy wykonać następujące działanie: 2-5 = -3. No i tutaj mamy mały szkopuł, pojawił się znak minus, a jego nie ma w liczbach dwójkowych. Cóż więc zrobić.
Oczywiście ten problem został szybko rozwiązany, lecz nie sie on za sobą ciekawe błędy, wynikające z nieostrożności programisty niż z błędów komputera.
Jak zapisać w kodzie dwójkowym liczbę ujemną. Rozpatrzmy to na przykładzie 4-cyfrowej liczby binarnej (będzie łatwiej).
Otóż umówiono się, że najstarszy bit w liczbie będzie tzw. bitem znaku - 0 oznaczać będzie liczbę dodatnią, 1 - liczbę ujemną.
No dobrze spróbujmy się z tym pobawić.
Weźmy np liczbę 3 - w kodzie dwójkowym jest to: 11.
Uzupełnijmy ją do czterocyfrowej liczby dwójkowej: 0011.
Zatem najprościej liczba -3 wyglądałaby następująco : 1011 (najstarszy bit 1 czyli ujemna).
Zobaczmy czy to jest dobrze. Najprościej sprawdzić to dodając obie liczby do siebie: 3 + (-3) = 0.
0011
1011
-----
1110
Łoł ... i wyszedł zonk zgodnie z naszą zasadą 3 + (-3) = -6, a powinno być 0.
Czyli nasza umowa dotycząca wyglądu liczby ujemnej nadaje się na szczaw. I tu dochodzimy do nieszczęsnego U2.
U2 zwany pospolicie kodem uzupełnień do 2 polega na tym, że aby stworzyć liczbę ujemną wszystkie bity naszej liczby negujemy a potem dodajemy do najmłodszego bitu 1.
Spróbujmy to zrobić z naszą nieszczęsną 3
0011 - nasza liczba
1100 - liczba po zanegowaniu (zamiana 1<->0)
1101 - po dodaniu do najmłodszego 1.
czyli -3 = 1101
Sprawdźmy, jak poprzednio:
0011
1101
----
0000
Sukces.
Jakie to niesie za sobą problemy. W swojej długiej karierze programistycznej parę razy sam się na nie nabrałem.
Weźmy np i wykonajmy w liczbach całkowitych (czery cyfry binarne) następujące działanie: 4 + 5.
Z arytmetyki wiemy, że wynosi to 9. Zobaczymy jak policzy komputer:
0100
0101
----
1001
binarnie jest to liczba 8, ale my liczymy w liczbach całkowitych, więc ponieważ najstarszy bit jest równy 1 - mamy do czynienia z liczbą ujemną jaką policzmy:
1001
1000 po odjęciu 1
0111 po zanegowaniu: 7 czyli -7
lub inaczej -8 + 0*4 + 0*2 + 1 = -8 +1 = -7 czyli
4 + 5 = -7
Skąd ten problem, ano... przy takim zapisie dla czterocyfrowej liczby całkowitej zakres wynosi od -8 do 7, a wynik nie mieści sie w zakresie i stąd ten błąd. Dlatego też wykonując rózne obliczenia programista musi przewidzieć okoliczność coby w wyniku różnych działań nie przekroczyć zakresu. W naszym przypadku wystarczyłoby operować na bajcie czyli 8 bitach i byłoby po problemie, chociaż nie do końca, bo tutaj zakres jest od -128 do 127 itd.
Ćwiczenia:
Przedstaw liczby: -115, -41, -100 w zapisie U2 dla liczby całkowitej zapisanej na bajcie.
Wbrew oczekiwaniom tematem dzisiejszego wykładu nie będzie historia zespołu U2.
Jak pamiętacie z poprzednich wykładów na liczbach binarnych da się zapisać liczby naturalne.
W zastosowaniach operowanie takimi tylko liczbami stwarza duże problemy. Na przykład chcielibyśmy wykonać następujące działanie: 2-5 = -3. No i tutaj mamy mały szkopuł, pojawił się znak minus, a jego nie ma w liczbach dwójkowych. Cóż więc zrobić.
Oczywiście ten problem został szybko rozwiązany, lecz nie sie on za sobą ciekawe błędy, wynikające z nieostrożności programisty niż z błędów komputera.
Jak zapisać w kodzie dwójkowym liczbę ujemną. Rozpatrzmy to na przykładzie 4-cyfrowej liczby binarnej (będzie łatwiej).
Otóż umówiono się, że najstarszy bit w liczbie będzie tzw. bitem znaku - 0 oznaczać będzie liczbę dodatnią, 1 - liczbę ujemną.
No dobrze spróbujmy się z tym pobawić.
Weźmy np liczbę 3 - w kodzie dwójkowym jest to: 11.
Uzupełnijmy ją do czterocyfrowej liczby dwójkowej: 0011.
Zatem najprościej liczba -3 wyglądałaby następująco : 1011 (najstarszy bit 1 czyli ujemna).
Zobaczmy czy to jest dobrze. Najprościej sprawdzić to dodając obie liczby do siebie: 3 + (-3) = 0.
0011
1011
-----
1110
Łoł ... i wyszedł zonk zgodnie z naszą zasadą 3 + (-3) = -6, a powinno być 0.
Czyli nasza umowa dotycząca wyglądu liczby ujemnej nadaje się na szczaw. I tu dochodzimy do nieszczęsnego U2.
U2 zwany pospolicie kodem uzupełnień do 2 polega na tym, że aby stworzyć liczbę ujemną wszystkie bity naszej liczby negujemy a potem dodajemy do najmłodszego bitu 1.
Spróbujmy to zrobić z naszą nieszczęsną 3
0011 - nasza liczba
1100 - liczba po zanegowaniu (zamiana 1<->0)
1101 - po dodaniu do najmłodszego 1.
czyli -3 = 1101
Sprawdźmy, jak poprzednio:
0011
1101
----
0000
Sukces.
Jakie to niesie za sobą problemy. W swojej długiej karierze programistycznej parę razy sam się na nie nabrałem.
Weźmy np i wykonajmy w liczbach całkowitych (czery cyfry binarne) następujące działanie: 4 + 5.
Z arytmetyki wiemy, że wynosi to 9. Zobaczymy jak policzy komputer:
0100
0101
----
1001
binarnie jest to liczba 8, ale my liczymy w liczbach całkowitych, więc ponieważ najstarszy bit jest równy 1 - mamy do czynienia z liczbą ujemną jaką policzmy:
1001
1000 po odjęciu 1
0111 po zanegowaniu: 7 czyli -7
lub inaczej -8 + 0*4 + 0*2 + 1 = -8 +1 = -7 czyli
4 + 5 = -7
Skąd ten problem, ano... przy takim zapisie dla czterocyfrowej liczby całkowitej zakres wynosi od -8 do 7, a wynik nie mieści sie w zakresie i stąd ten błąd. Dlatego też wykonując rózne obliczenia programista musi przewidzieć okoliczność coby w wyniku różnych działań nie przekroczyć zakresu. W naszym przypadku wystarczyłoby operować na bajcie czyli 8 bitach i byłoby po problemie, chociaż nie do końca, bo tutaj zakres jest od -128 do 127 itd.
Ćwiczenia:
Przedstaw liczby: -115, -41, -100 w zapisie U2 dla liczby całkowitej zapisanej na bajcie.
