Dlaczego liczby szesnastkowe mają prefiks jako 0x
? Rozumiem użycie przedrostka, ale nie rozumiem znaczenia, dlaczego 0x
został wybrany.
Dlaczego liczby szesnastkowe mają prefiks jako 0x
? Rozumiem użycie przedrostka, ale nie rozumiem znaczenia, dlaczego 0x
został 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: x
jest 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 1234
liczb ósemkowych. Kiedy Ken Thompson utworzył B z BCPL, 0
zamiast tego użył przedrostka. To świetnie, ponieważ
0
jest 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, 0x
został wybrany arbitralnie ( 00
prawdopodobnie został wykluczony jako niezręczny).
C # jest potomkiem C, więc dziedziczy składnię.
0x
ponad 00
był preferencji / nieporadność. 00
zepsułby istniejący kod. 0010
jak ósemkowy 8
, a 0010
jak szesnastkowy 16
. Nie mogli użyć żadnej liczby jako wskaźnika drugiej cyfry (z wyjątkiem 8
lub 9
, i żadna nie ma żadnego znaczenia związanego z liczbą szesnastkową), więc litera jest koniecznością. I to pozostawia albo 0h
albo 0x
( H e X idecimal). Od tego momentu wydaje się, że naprawdę wraca do preferencji.
0
przedrostka ó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 8
lub 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!
0xFFAB1234
należ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:
0x6400
tł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
? x
Nadal 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ń!