2010-04-19 15 views
299

Dlaczego liczby szesnastkowe mają prefiks jako 0x? Rozumiem użycie prefiksu, ale nie rozumiem znaczenia, dlaczego wybrano 0x.Dlaczego numery heksadecymalne mają przedrostek 0x?

+5

Teraz zdaję sobie sprawę, że tytuł i tekst stawiają dwa zupełnie różne pytania. Większość odpowiedzi skupia się na pytaniu w tytule. Odpowiedź na pytanie w tekście jest po prostu "nic nie znaczy - jest to po prostu przedrostek informujący kompilator, że liczba całkowita jest zapisana w systemie szesnastkowym". –

+20

Aby być pedantycznym, można również interpretować pytanie w tytule na dwa różne sposoby: 1) "Dlaczego liczby szesnastkowe mają prefiks jako 0x, w przeciwieństwie do jakiegokolwiek innego prefiksu lub wskaźnika?" 2) "Dlaczego musimy używać prefiksu podczas wprowadzania liczb szesnastkowych? Z pewnością kompilator rozpozna 58A jako liczbę szesnastkową, nawet bez prefiksu?" Odpowiedź na drugą interpretację pytania jest banalna. "123" jest również liczbą szesnastkową. –

+1

Edytowałem pytanie, aby odzwierciedlić pierwszą interpretację. A także naprawić angielski :) –

Odpowiedz

324

Krótka historia:0 mówi parser ma do czynienia ze stałą (a nie z identyfikatorem/zastrzeżonym słowem). Coś jest jeszcze potrzebne, aby określić podstawę numeru: x jest arbitralnym wyborem.

Wielkim: W latach 60-tych, z dominującym programowania systemów liczba były dziesiętne i ósemkowy - systemy komputerowe miał 12, 24 albo 36 bity na bajt, który jest dobrze podzielna przez 3 = log2 (8).

W języku BCPL użyto składni 8 1234 dla liczb ósemkowych. Kiedy Ken Thompson stworzył B z BCPL, użył prefiksu 0. To jest wielki, ponieważ

  1. stałą całkowitą teraz zawsze składa się z jednego powodu,
  2. parser może jeszcze powiedzieć od razu, że ma stałą,
  3. parser może od razu powiedzieć podstawy (0 jest sama w obu bazach),
  4. to matematycznie sane (00005 == 05) i
  5. żadne szlachetne znaki specjalne są potrzebne (jak w #123).

gdy C został stworzony z B, potrzeba szesnastkowe powstał (PDP-11 miała 16-bitowe słowa) i wszystkie z powyższych punktów nadal ważny.Ponieważ ósemki były nadal potrzebne dla innych maszyn, wybrano arbitralnie 0x (00 został prawdopodobnie wykluczony jako niezręczny).

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

+76

Nie uważam, że "0x" w stosunku do '00' było preferencją/niezręcznością. '00' złamie istniejący kod. '0010' jako ósemkowy to' 8', natomiast '0010' jako szesnastkowy oznacza' 16'. Nie mogli użyć żadnej liczby jako wskaźnika drugiej cyfry (oprócz "8" lub "9", a żadne z nich nie ma znaczenia związanego z szesnastkowymi), więc litera jest koniecznością. I pozostawia '0h' lub' 0x' (** H ** e ** X ** idecimal). Od tego momentu wydaje się, że jest to powrót do preferencji. – GManNickG

+1

Powiązane: http://stackoverflow.com/questions/18987911/bcpl-octal-numerical-constants i http://stackoverflow.com/questions/11483216/why-are-leading-zeroes-used-to-represent-octal -numbers –

+15

Użycie przedrostka '0' dla ó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 przeanalizowałoby je jako ósemkowe, łamiąc numer przed zapisaniem. Aby dodać do zabawy, jeden popularny produkt bazodanowy musiałby płynnie powrócić do analizy dziesiętnej, jeśli liczba zawierała '8' lub' 9'. – Basic

84

Uwaga: Nie znam poprawnej odpowiedzi, ale poniżej jest tylko moja osobista spekulacja!

Jak już wspomniałem 0 przed szereg Oznacza to ósemkowy:

04524 // octal, leading 0 

Wyobraź konieczności wymyślić system do oznaczenia liczb w systemie szesnastkowym, i pamiętać, że pracujemy w środowisku C stylu. Co powiesz na zakończenie montażu h? Niestety nie możesz - pozwoli ci to na tworzenie tokenów, które są poprawnymi identyfikatorami (np. Możesz nazwać zmienną to samo), co spowodowałoby pewne nieprzyjemne niejasności.

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

Nie można prowadzić z charakterem tego samego powodu:

xFF00 // also valid identifier 

Korzystanie hash został prawdopodobnie wyrzucony, ponieważ jest ono sprzeczne z preprocesora:

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

W Koniec, z jakiegokolwiek powodu, zdecydowali się umieścić x po wiodącym 0, aby określić szesnastkowy. Jest to jednoznaczne, ponieważ wciąż zaczyna się od znaku numer, więc nie może być poprawny identyfikator i jest prawdopodobnie oparty off konwencję ósemkowy wiodącego 0.

0xFF00 // definitely not an identifier! 
+2

Interesujące. Wyobrażam sobie, że mogli użyć znaku wiodącego 0 ORAZ ciągłego h do oznaczenia heksadecymalnego. Końcowy h prawdopodobnie zostałby zmylony z sufiksem typu specyfikatora, np. 0xFF00l vs 0FF00hl – zdan

+1

Ten argument sugeruje, że użycie wiodącego zera do oznaczenia liczb ósemkowych poprzedza użycie szesnastkowego prefiksu "0x". Czy to prawda? –

+1

Czy nie obaj zostali wymyśleni w tym samym czasie? Dlaczego miałby być jeden, ale nie drugi? – AshleysBrain

16

SIMPLE

Jest to przedrostek, aby wskazać numer jest w systemie szesnastkowym zamiast w jakiejś innej podstawy. Język programowania C używa go do informowania kompilatora.

przykład:

0x6400 przekłada się 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. Gdy kompilator odczytuje 0x6400 to rozumie się liczbę szesnastkową pomocą 0x okresie. Zazwyczaj możemy rozumieć przez (6400) lub (6400) lub cokolwiek ..

Dla Binary będzie

0b00000001

Nadzieja pomogła w jakiś sposób.

Dzień dobry,

+0

Literały binarne są obsługiwane tylko w C++ od C++ 14 i nie są obsługiwane w ogóle w C. – Ruslan

0

Poprzedzający 0 służy do wskazania numeru w bazie 2, 8 lub 16.

Moim zdaniem 0x został wybrany do wskazania hex ponieważ dźwięki 'x' jak hex.

Po prostu moja opinia, ale myślę, że ma to sens.

Dzień dobry!

+1

Dzięki za odpowiedź! Rozumiem, że to twój pierwszy wpis na StackOverflow. Odpowiedź mogłaby być bardziej pomocna, gdyby opinie były oddzielone od faktów. –

Powiązane problemy