Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 
Polski Portal COLOBOTa
COLOBOT Polish Portal

Inne języki programowania - Liczby szesnastkowe?

FE4R - 08-01-2010, 20:55
Temat postu: Liczby szesnastkowe?
Hej hej,

Zacząłem samemu uczyć się C++, gdyż na informatyce nie było miejsc.
Czytając podręcznik / poradnik do języka C++, natknąłem się na frazę 'liczby szesnastkowe', np. 7F (poprzedzone 0X, by zadeklarować je jako liczby szesnastkowe).
Zastanawiam się, jakie mają znaczenie w programowaniu, gdyż w matematyce chyba żadne (moja nauczycielka czegoś takiego nie zna).

sajmon313 - 08-01-2010, 21:05

matematyka działa tak samo w systemie dziesiętnym, szesnastkowym, ósemkowym, binarnym, siódemkowym i każdym innym.

Czasami program który z założenia ma akceptować tylko liczby dziesiętne akceptuje też szesnastkowe (automatycznie je konwertuje).

adiblol - 08-01-2010, 22:19

Liczby szesnastkowe mają podstawę 16, która jest potęgą 2 - 1 cyfra składa się z 4 cyfr binarnych (2^4=16) (np. F=1111, 8=1000)
Liczby dziesiętne mają podstawę 10, która nie jest potęgą 2 - stąd nie można ich tak łatwo konwertować na liczby binarne.

Reaper - 27-03-2010, 22:29

Binarny (dwójkowy) z tego co wiem, zapisuje się tak: 1 | 2 | 4 | 8 (...) | 8192 ?

No i moje pytanie jest takie, czy czyta się je od prawej do lewej, czy to jest umowne (od lewej do prawej)?

adiblol - 27-03-2010, 23:20

Źle ;x
Pisze się little endian, czyli tak
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
np. w assemblerze
mov al, 00001001b
oznacza przeniesienie wartości 9 do rejestru.

Nie wiem jak się czyta.

Żeby kogoś nie zmyliło...
w komputerach PC występuje big endian. Ma on wiele zalet, ale wadę w postaci braku przejrzystości. Popatrzmy jak wygląda liczba 0x01020304 w pamięci:
0x04, 0x03, 0x02, 0x01
Czyli binarnie:
00000100 , 00000011 , 00000010 , 00000001
Celowo dałem przecinki, bowiem mamy tu różne notacje - zarówno kolejność BAJTÓW big-endian, jak i kolejność BITÓW little-endian.
Tak naprawdę nie wiemy, jak w _pamięci komputera_ ustawione są bity - ale to nas nie obchodzi, bowiem zawsze czytamy/piszemy do RAMu bajt jako całość.
**ALE!**
Niektóre human-readable zrzuty pamięci zamieniają bajty na word'y i long'i, np. w widoku nie mamy:
Kod:
00000020 45 AB 32 9A

lecz:
Kod:
000010B0 1218 A4FE

albo wręcz:
Kod:
00001340 4A2C98D1

Co z tego wynika?
Wydajmy polecenie w bash'u i popatrzmy:
Kod:
adiblol@hydrogen:~$ echo -ne "\xDE\xAD\xBE\xEF" | hexdump
0000000 adde efbe                             
0000004

Co widzimy? Daliśmy programowi do heksadecymalnego oglądania wejścia strumień bajtów w takiej kolejności: DE, AD, BE, EF. Otrzymaliśmy ADDE, EFBE. hexdump zamienił sekwencje 2-bajtowe na word'y.

Popatrzmy do manuala hexdump'a i napiszmy odpowiedni ciąg formatujący:
Kod:
adiblol@hydrogen:~$ echo -ne "\xDE\xAD\xBE\xEF" | hexdump -e '/1 "%08_ax %08X\n"'
00000000 000000DE
00000001 000000AD
00000002 000000BE
00000003 000000EF

Za ilość bitów odpowiada: hexdump -e '/1 "%08_ax %08X\n"'. Zmieńmy jedynkę na coś innego:
Kod:
adiblol@hydrogen:~$ echo -ne "\xDE\xAD\xBE\xEF" | hexdump -e '/2 "%08_ax %08X\n"'
00000000 0000ADDE
00000002 0000EFBE

I na coś jeszcze innego:
Kod:
adiblol@hydrogen:~$ echo -ne "\xDE\xAD\xBE\xEF" | hexdump -e '/4 "%08_ax %08X\n"'
00000000 EFBEADDE

Jeśli ktoś chce w przyszłości zostać informatykiem, to powinien przeanalizować sobie te skutki zmiany ilości bajtów ...

Berserker - 29-03-2010, 14:16

Ze co?

// Że g*wno, 1:0 -adiblol

FE4R - 31-03-2010, 22:38

adiblol, po studiach informatycznych jesteś?
adiblol - 31-03-2010, 23:37

Cytat:
adiblol, po studiach informatycznych jesteś?

"Papiery" (dokumenty) są dla noobów :mrgreen: .
"Oficjalnie" jestem na takim samym poziomie jak reszta noobów co nawet Ubuntu zainstalować nie potrafią...
...MEN ssie...
amen.

FE4R - 01-04-2010, 11:39

adiblol napisał/a:
"Papiery" (dokumenty) są dla noobów :mrgreen: .
"Oficjalnie" jestem na takim samym poziomie jak reszta noobów co nawet Ubuntu zainstalować nie potrafią...
...MEN ssie...
amen.

Uczyłbyś się za granicą - byłoby tak samo. Trzeba być tym zainteresowanym, dlatego też pytam. ^^ (Nie, nie zainteresowanym Tobą, tylko informatyką). :mrgreen:

Simbax - 02-10-2010, 13:46

Wyczytałem sobie w google, że szesnastkowy system się stosuje dlatego, że zapis w nim jest krótszy od dziesiętnego :) Np. AB12 to liczba 43794 Ciekawych rzeczy się dowiedziałem z tego artykułu: http://www.programuj.com/...ne/sysliczb.php , pod koniec jest o zapisie szesnastkowym. BTW Resztę się wcześniej na matmie z ciekawostek dowiedziałem ;p
Programerus - 02-10-2010, 15:17

Nie dlatego że jest krótszy od dziesiętnego, tylko dlatego że jest krótszy od binarnego np.

0010 0101 to szesnastkowo 25 :D

Simbax - 02-10-2010, 16:06

Ale od dziesiętnego też :-P
Programerus - 03-10-2010, 01:32

Od dziesiętnego też, ale nie ma dużej różnicy.
Berserker - 03-10-2010, 11:34

System szesnastkowy jest niby krotszy od dziesietnego, ale zamiana z dziesietnego na szesnastkowy to masakra i operowanie na dziesietnym jest duzo latwiejsze.
adiblol - 03-10-2010, 13:53

Jest łatwiejszy ponieważ jesteś przyzwyczajony. Dla komputera łatwiejszy jest szesnastkowy, ponieważ *zawsze* 1 cyfra szesnastkowa to 4 cyfry dwójkowe.
Berserker - 03-10-2010, 14:31

Komputer nie moze operowac w systemie innym niz dwojkowy, moze jedynie dane zapisywac i wyswietlac w szesnastkowym. Kiedys eksperymentowano z systemem trojkowym (brak napiecia, 5V i 12V) ale nie zawsze te napiecia sie idealnie zgadzaja i komputer nie wiedzial co zrobic np z napieciem 8V

Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group