Dlaczego liczby szesnastkowe poprzedzone są znakiem 0x?

Dlaczego liczby szesnastkowe są poprzedzone prefiksem 0x? Rozumiem użycie przedrostka, ale nie rozumiem znaczenia, dlaczego 0x został wybrany.

 326
Author: Thomas Bratt, 2010-04-20

4 answers

Krótka historia: 0 mówi parserowi, że ma do czynienia ze stałą (a nie identyfikatorem / słowem zastrzeżonym). Coś jest jeszcze potrzebne, aby określić bazę liczb: {[1] } jest wyborem arbitralnym.

Długa historia: W latach 60-tych powszechne systemy liczbowe były dziesiętne i ósemkowe - mainframe miały 12, 24 lub 36 bitów na bajt, co jest ładnie podzielne przez 3 = log2(8).

Język BCPL używał składni 8 1234 dla liczb ósemkowych. Kiedy Ken Thompson stworzył B z BCPL, użył prefiksu 0. To jest świetne, ponieważ

  1. stała całkowita teraz zawsze składa się z pojedynczego tokena,
  2. parser może od razu stwierdzić, że ma stałą,
  3. Parser może od razu powiedzieć, że baza ({[0] } jest taka sama w obu bazach),
  4. jest matematycznie rozsądne (00005 == 05) i
  5. nie są potrzebne żadne cenne znaki specjalne (jak w #123).

Gdy C powstało z B, pojawiło się zapotrzebowanie na liczby szesnastkowe (PDP-11 miał słowa 16-bitowe) i wszystkie powyższe punkty były nadal aktualne. Ponieważ oktale były nadal potrzebne dla innych maszyn, 0x został wybrany arbitralnie (00 został prawdopodobnie wykluczony jako niezręczny).

C # jest potomkiem C, więc dziedziczy składnię.

 355
Author: Řrřola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-03 00:42:39

uwaga: nie znam poprawnej odpowiedzi, ale poniżej to tylko moje osobiste spekulacje!

Jak wspomniano 0 przed liczbą oznacza, że jest ósemkowa:

04524 // octal, leading 0

Wyobraź sobie potrzebę wymyślenia systemu oznaczającego liczby szesnastkowe i zauważ, że pracujemy w środowisku w stylu C. A co z zakończeniem NA h jak montaż? Niestety nie możesz-pozwoli to na tworzenie tokenów, które są ważnymi identyfikatorami (np. można nazwać zmienną to samo), które to by powodowało nieprzyjemne niejasności.

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

Nie możesz prowadzić z postacią z tego samego powodu:

xFF00 // also valid identifier

Użycie hasha zostało prawdopodobnie wyrzucone, ponieważ koliduje z preprocesorem:

#define ...
#FF00 // invalid preprocessor token?

W końcu, z jakiegokolwiek powodu, zdecydowali się umieścić x po wiodącym 0, aby oznaczać szesnastkowy. Jest ona jednoznaczna, ponieważ nadal zaczyna się od znaku liczby, więc nie może być prawidłowym identyfikatorem i prawdopodobnie opiera się na konwencji ósemkowej wiodącego 0.

0xFF00 // definitely not an identifier!
 86
Author: AshleysBrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-22 12:59:53

SIMPLE

Jest to prefiks, który wskazuje, że liczba jest w systemie szesnastkowym, a nie w innej bazie. Język programowania C używa go do określenia kompilatora.

Przykład:

0x6400 przekłada się na 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. Gdy kompilator odczytuje 0x6400, rozumie, że liczba jest szesnastkowa za pomocą0x term. Zwykle możemy zrozumieć przez (6400)16 lub (6400)8 albo cokolwiek ..

Dla binarnego będzie be

0b00000001

Nadzieja w jakiś sposób pomogła.

Dzień Dobry ,

 17
Author: loyola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 08:21:52

Poprzedzające 0 jest używane do wskazania liczby w bazie 2, 8 lub 16.

Moim zdaniem, 0x zostało wybrane, aby wskazać hex, ponieważ 'x' brzmi jak hex.

Tylko moje zdanie, ale myślę, że ma sens.

Miłego Dnia!

 2
Author: Johnny Low,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 00:53:09