Dlaczego liczby szesnastkowe mają prefiks jako 0x? Rozumiem użycie przedrostka, ale nie rozumiem znaczenia, dlaczego 0xzostał wybrany.
Dlaczego liczby szesnastkowe mają prefiks jako 0x? Rozumiem użycie przedrostka, ale nie rozumiem znaczenia, dlaczego 0xzostał wybrany.
Odpowiedzi:
Krótka historia:0 mówi parser to do czynienia ze stałą (i nie identyfikator / zastrzeżone wyrazu). Potrzebne jest jeszcze coś, aby określić podstawę liczb: xjest to arbitralny wybór.
Długa historia: w latach 60-tych powszechne systemy liczb programowych były dziesiętne i ósemkowe - komputery mainframe miały 12, 24 lub 36 bitów na bajt, co można łatwo podzielić przez 3 = log2 (8).
W języku BCPL zastosowano składnię 8 1234liczb ósemkowych. Kiedy Ken Thompson utworzył B z BCPL, 0zamiast tego użył przedrostka. To świetnie, ponieważ
0jest taki sam w obu bazach),00005 == 05) i#123).Kiedy C utworzono z B, pojawiła się potrzeba liczb szesnastkowych (PDP-11 miał 16-bitowe słowa) i wszystkie powyższe punkty były nadal aktualne. Ponieważ ósemki były nadal potrzebne dla innych maszyn, 0xzostał wybrany arbitralnie ( 00prawdopodobnie został wykluczony jako niezręczny).
C # jest potomkiem C, więc dziedziczy składnię.
0xponad 00był preferencji / nieporadność. 00zepsułby istniejący kod. 0010jak ósemkowy 8, a 0010jak szesnastkowy 16. Nie mogli użyć żadnej liczby jako wskaźnika drugiej cyfry (z wyjątkiem 8lub 9, i żadna nie ma żadnego znaczenia związanego z liczbą szesnastkową), więc litera jest koniecznością. I to pozostawia albo 0halbo 0x( H e X idecimal). Od tego momentu wydaje się, że naprawdę wraca do preferencji.
0przedrostka ósemkowego spowodowało tak wiele problemów na przestrzeni lat. Zwłaszcza w krajach takich jak Wielka Brytania, gdzie numery telefonów zaczynają się od 0. JavaScript i wiele innych języków parsuje je jako liczby ósemkowe, zmieniając liczbę przed zapisaniem. Aby dodać do zabawy, jeden popularny produkt bazy danych po cichu przestawiłby się na parsowanie dziesiętne, jeśli liczba zawierała 8lub 9.
Uwaga: nie znam poprawnej odpowiedzi, ale poniżej to moja osobista spekulacja!
Jak wspomniano 0 przed liczbą oznacza, że jest ósemkowa:
04524 // octal, leading 0
Wyobraź sobie, że musisz opracować system oznaczania liczb szesnastkowych i zauważ, że pracujemy w środowisku typu C. Co powiesz na zakończenie h jak montaż? Niestety nie możesz - pozwoliłoby ci to tworzyć tokeny, które są poprawnymi identyfikatorami (np. Możesz nazwać zmienną to samo), co powodowałoby nieprzyjemne niejasności.
8000h // hex
FF00h // oops - valid identifier! Hex or a variable or type named FF00h?
Nie możesz prowadzić postacią z tego samego powodu:
xFF00 // also valid identifier
Używanie skrótu zostało prawdopodobnie wyrzucone, ponieważ powoduje konflikt z preprocesorem:
#define ...
#FF00 // invalid preprocessor token?
Ostatecznie, z jakiegokolwiek powodu, postanowili wstawić x po wiodącym 0, aby oznaczyć szesnastkowo. Jest to jednoznaczne, ponieważ wciąż zaczyna się od znaku liczbowego, więc nie może być prawidłowym identyfikatorem i prawdopodobnie opiera się na konwencji ósemkowej wiodącego 0.
0xFF00 // definitely not an identifier!
0xFFAB1234należy zapisać jako 0FFAB1234h. Pamiętam to z wbudowanego asm w Pascalu, kiedy byłem młody stackoverflow.com/q/11733731/995714
Jest to przedrostek wskazujący, że liczba jest szesnastkowa, a nie w innej bazie. Język programowania C używa go do informowania kompilatora.
Przykład:
0x6400tłumaczy się 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
Kiedy kompilator czyta 0x6400, rozumie, że liczba jest szesnastkowa za pomocą 0x warunku . Zwykle możemy zrozumieć przez (6400) 16 lub (6400) 8 lub cokolwiek ...
W przypadku pliku binarnego byłoby to:
0b00000001
Mam nadzieję, że w jakiś sposób pomogłem.
Dobry dzień!
x6400? xNadal może być wykorzystywany do wywnioskować szesnastkowo.
Poprzednie 0 służy do wskazania liczby w podstawie 2, 8 lub 16.
Moim zdaniem wybrano 0x, aby wskazać hex, ponieważ „x” brzmi jak hex.
Po prostu moja opinia, ale myślę, że to ma sens.
Dobry dzień!