Gdzie przydatne są ósemki? [Zamknięte]


36

Właśnie uderzyłem głową o stół przez około 20 minut, patrząc na całkowicie dziwny błąd w PHP, a potem zdałem sobie sprawę, że jest ósemka. Oktal <% (* i #>).

Krótko mówiąc, uzupełniałem literały zerami, aby kod był wyrównany, wiem, wielki błąd. Zapomniałem o ósemkach.

Pytanie brzmi: czy ktoś używa liczb ósemkowych do celów innych niż uprawnienia do plików? (Osobiście wolę, chmod ugo+rwxale rozumiem, że jeśli muszą być generowane programowo, warto używać ósemek.) Ale czy są przydatne w jakiejkolwiek innej sytuacji?


16
Opcja A: obwiniaj się. Opcja B: obwiniaj świat. Opcja C: chichot, gdy się czegoś nauczyłeś.
Job

12
@Petrozza - IMO użycie wiodącego zera w stylu C do oznaczenia ósemki nigdy nie było dobrym wyborem, ale jego historia - prawdopodobnie trochę dziedzictwa C, choć może być nawet starsze. Myślę, że Ada ma jedną z lepszych konwencji - zapisano by liczbę ósemkową 8 # 1234567 #, liczbę szesnastkową 16 # abcdef # itp. I zera wiodące to tylko zera wiodące - każda podstawa od 2 do 16 (przynajmniej) jest poprawna i wszystkie są wizualnie oczywiste i łatwe do zrozumienia.
Steve314,

2
@Petruza Twoje pytanie w oryginalnej formie nie było konstruktywne dla tej witryny i zostało ulepszone przez społeczność, aby pozostało otwarte: zapoznaj się z często zadawanymi pytaniami, aby dowiedzieć się, dlaczego ludzie to robią i dlaczego zachęcamy. Jeśli masz dodatkowe pytania lub wątpliwości, zgłoś je na naszej stronie meta-dyskusji , a nie w pytaniu.

11
Opcja D: „obwinianie PHP” jest zawsze właściwym wyborem, bez względu na problem
głowonogi

2
@ Steve314 Całkowicie się zgadzam. Innym ważnym przykładem jest Python gdzie mają 0oprefiks (co jest zgodne z 0xa 0b, ale może trochę trudne do odróżnienia od 00). A od Python 3 dodatkowe zera wiodące są błędem składniowym, aby zapobiec tego rodzaju błędom.
5gon12eder

Odpowiedzi:


42

Według Wikipedii ósemki nie są tak powszechne, jak kiedyś. Jak już wspominali inni, w przeszłości systemy posiadały słowo 12/24/36-bitowe, które jest łatwiej reprezentowane w formacie ósemkowym niż szesnastkowym, ale obecnie architektury x86 i i64 używają bitów 16/32/64 słowo, które jest łatwiej reprezentowane w systemie szesnastkowym, a wręcz brzydkie w formacie ósemkowym.

Obecne zastosowania obejmują jednak:

Zauważ, że współczesne języki programowania czasami nie obsługują już ósemek z powodu braku przypadków użycia i potencjalnego błędu. C # jest przykładem, jak napisał to Eric Lippert w trzeciej i czwartej edycji TCPL :

C # nie obsługuje literałów ósemkowych z dwóch powodów. Po pierwsze, prawie nikt obecnie nie używa literałów ósemkowych. Po drugie, jeśli liczba ósemkowa obsługiwana przez C # w standardowym formacie „wiodącym zero” oznacza liczbę ósemkową, byłoby to potencjalne źródło błędów. Rozważ ten kod:

    FlightNumber = 0541;

Wyraźnie to wyrażenie ma postać literału dziesiętnego, a nie literału ósemkowego.

Powiązany, a jedynie dla odniesienia i ciekawości, Code, The Hidden Language of Computer Hardware ma doskonałe, łatwe do naśladowania objaśnienie liczb ósemkowych i innych systemów liczbowych na stronie 55 - 63 .


1
W tej notatce należy uważać na JavaScript podczas obsługi danych wejściowych użytkownika. parseInt(011)==9
Darien,

3
To naprawdę interesujące w Yuki i Pamean. Właśnie przyszło mi do głowy, że liczenie palców w systemie szesnastkowym jest dość łatwe, jeśli używasz wnętrza każdego palca, używając pewnych odmian, takich jak ten
ocodo

@ Slomojo - w rzeczywistości możesz policzyć na 99 palców ...
detly

3
+1 za bardzo wyczerpującą odpowiedź. Grace Hopper powiedziała kiedyś, że ma problemy z balansowaniem książeczki czekowej, ponieważ stała się tak biegła w dodawaniu ósemek.
Macneil,

14
@detly, jeśli wiem, że muszę liczyć duże liczby, użyję moich 10 cyfr jako bitów i policzę do 1024 za pomocą moich palców (tylko uważaj, komu pokazujesz numery 4, 128 i 132).
zzzzBov

17

Octal był szeroko używany około 50 lat temu przez Digital Equipment Corp. (DEC) i inne firmy, które miały komputery z 12-bitowym słowem (np. PDP-8) lub innymi wielokrotnościami sześciu, takimi jak 18 i 36 (np. UNIVAC 1108 ). Używałem zarówno PDP-8, jak i UNIVAC 1108 w szkole podstawowej. Znaki na obu maszynach zwykle używały sześciu bitów, a nie 8.

Format instrukcji PDP-8

Format instrukcji PDP-8 - zauważ, że bity są ponumerowane 0 -> 11. Bit 0 był MSB (najbardziej znaczący bit).

Kiedy DEC wyszedł z 16-bitowym PDP-11, nadal używali liczby ósemkowej w swojej dokumentacji zamiast szesnastkowej, jak używali inni producenci minikomputerów, oferując wówczas 16-bitowe maszyny. Prawdopodobnie wynikało to z wielu 3-bitowych pól w formatach instrukcji PDP-11, takich jak Register, Mode i Src / Dest, które nadawały się do dekodowania jako cyfra ósemkowa. (Podziękowania dla Johna Strohm za zwrócenie na to uwagi.)

Co ciekawe, kiedy Motorola wyszła ze swoim mikroprocesorem 68000, na który PDP-11 miał duży wpływ i miał w instrukcji te same 3-bitowe pola Trybu i Rejestru, zdecydował się używać w swojej dokumentacji tylko szesnastkowego.

Ponieważ PDP-11 używał notacji ósemkowej, oryginalne kody uprawnień dla Uniksa, które po raz pierwszy pojawiły się na PDP-11, również używały liczby ósemkowej. To dziedzictwo utrzymuje się w Linuksie, gdzie komenda chmod nadal używa ósemki do określenia każdego z trzech bitowych pól „rwx”.

Więcej ciekawostek - CompuServe, która była szeroko stosowaną telefoniczną usługą telefoniczną w latach 80. i na początku lat 90. (zanim została przyćmiona przez AOL), działała na minikomputerach DEC, przynajmniej pierwotnie. Wszystkie identyfikatory użytkownika były numeryczne iw pewnym momencie zauważyłem, że nigdy nie zawierały żadnych 8 lub 9, więc były ósemkowe. Mój stary identyfikator CIS to 70205.


1
Twój komentarz na temat dokumentacji PDP-11 jest niepoprawny. PDP-11 miał 8 rejestrów. R0-R5 były rejestrami ogólnego przeznaczenia. R6 był wskaźnikiem stosu, a R7 był komputerem. Instrukcja MOV przyjęła dwa 3-bitowe numery rejestrów i dwa 3-bitowe tryby adresowania. Oktal przechwytuje pola rejestru i trybu PERFEKCYJNIE. (Wątpię, czy to był wypadek). Użycie heksa pomieszałoby wszystko. PUSH i POP były tylko trybami adresowania używającymi R6. Natychmiastowym operandem był tryb adresowania wykorzystujący R7.
John R. Strohm

@ JohnR.Strohm Dzięki za komentarz dotyczący 3-bitowych rejestrów. Zgadzam się z twoją analizą i zaktualizowałem moją odpowiedź.
tcrosley,

DEC pracował w OCT. Powinieneś użyć wielokrotności 3,32 bitów, aby uniknąć nieporozumień.
user234461,

To zabawne, że nigdy nie uważałem uprawnień Unixa za liczbę ósemkową, zawsze myślałem o tym jako o trzech osobnych cyfrach zapisanych razem, każda reprezentująca trzy bity rwx, aby mogły być ósemkowe, dziesiętne, a nawet szesnastkowe.
axl

11

Heathkit użył ich na panelu przednim swojego H-8 oraz na liście języków asemblera swojego oprogramowania na panelu przednim (zwanym PAM-8). Umawiam się, wiem.

wprowadź opis zdjęcia tutaj

W dzisiejszych czasach ósemki są bardzo rzadkie; wszyscy wydają się używać hexa. Ale liczby wciąż wyglądają jak liczby ósemkowe i nie potrzebujesz dodatkowego rzędu klawiszy dla cyfr od A do F.


2
+1 dla H-8. Pomimo tego, że na zewnątrz był ósemkowy, procesor miał 8080A, czyli wszystkie bajty. Idź na figger.
Blrfl,

Sądzę, że używali ósemki do podobieństwa z H-11 (który miał procesor PDP-11).
Jerry Coffin,

2
8080 miał 8-bitowe bajty, ale zestaw instrukcji miał większy sens, jeśli spojrzał na ósemkę niż na szesnastkę.
RBerteig,

6

Jednym z powodów, dla których octal widzi użycie, jest to, że jest to największa baza, która jest potęgą 2, dla której nie potrzebujesz żadnych znaków specjalnych - to znaczy, że wszystkie cyfry mogą być numeryczne. Baza 16 (następna w górę od bazy 8) wymaga cyfr nienumerycznych (zwykle A, B, C, D, E, F).


Wiem, że to jest stare, ale dlaczego używanie tylko cyfr jest lepsze niż używanie liter?
Petruza

5

Używam ósemki na co dzień. Za każdym razem, gdy muszę przeskoczyć do pliku, używam ósemki (wcześniej zapisuję notację u + r ...). Za każdym razem, gdy chcę osadzić znak kontrolny w ciągu, używam ósemki ... (Tak, mógłbym użyć szesnastki, ale używam ósemki).


2
+1 za „ale używam
ósemki

5

Każdy, kto musi wyrazić kombinacje bitów zgrupowanych w trójki.

Dlaczego ktoś używa hexa?


Rzeczy z czubka mojej głowy, które są wyrażone jako liczby ósemkowe:

  • Kody skrzeczone przez transpondery Mode 3A w samolotach
  • Pewne wartości znaleziono w autobusie awioniki ARINC 429
  • Adresy SCSI
  • Kluczowe kody w ncursesbibliotece

11
Różnica polega na tym, że hex jest „naturalny” jako pół bajtu. Dwie cyfry szesnastkowe = 1 bajt. Ale nie można podzielić bajtów na liczby ósemkowe.
Mason Wheeler

2
Pierwszy wiersz zawiera oczywiste. Drugi stanowi słabą analogię.
back2dos

3
I hex jest całkowicie nienaturalny dla wszystkiego, co musi być wyrażone w grupach trzech bitów, takich jak wspomniane wyżej tryby plików Unix. Nie ma prawa, które mówi, że cyfry określonego systemu numeracji muszą pokrywać się z bajtami. Jeśli tak, wyrażanie czegokolwiek na komputerze jako bazy 10 byłoby gorszą praktyką niż baza 8, która przynajmniej dopasowuje się do grup bitów.
Blrfl,

6
typowy ciąg szesnastkowy jest oczywiście ciągiem szesnastkowym. octal nie jest.
Paul Nathan

1
@Blrfl: Więc ile z tych wspomnianych „[rzeczy, które] muszą być wyrażone w grupach po trzy bity” istnieje oprócz kanonicznego przykładu? To jest pytanie, na które do tej pory pozostawiłeś bez odpowiedzi. Zamiast tego robisz jeszcze jedną kiepską analogię. Istnieje rzeczywiste zastosowanie reprezentacji dziesiętnej, ponieważ po prostu nauczyliśmy się z tym obchodzić. Który z nich będzie Ci obliczyć szybciej? 7 * 6czy 07 * 06? Używamy dziesiętnych do reprezentowania liczb, ponieważ potrafimy je najlepiej obsługiwać, a szesnastkowych do reprezentowania liczb bardzo zbliżonych do sposobu, w jaki maszyna je przechowuje. I często to robimy. Ta strona jest pełna dowodów na to.
back2dos,

5

Kiedy pracowałem na komputerach mainframe CDC (z 60-bitowym słowem, 12-bitowym słowem dla PPU), wszystkie zrzuty rdzenia i takie były wykonywane ósemkowo (20 cyfr ósemkowych na słowo, 4 na słowo PPU).


3

Podobnie jak w systemie szesnastkowym, notacja ósemkowa jest czasami używana do określania kodów znaków. Może być przydatny z tego samego powodu, dla którego szesnastkowy jest: jest bardziej kompaktowy niż binarny, ale bardzo łatwo go przełożyć na binarny w twojej głowie.


2

Podobnie jak Hex, liczby ósemkowe można łatwo przekonwertować z formatu binarnego. Po prostu zgrupuj cyfry binarne w trzyosobowe grupy, zaczynając od prawej.

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)

7
To oczywiste. Pytanie dotyczy tego, kiedy jest to faktycznie używane .
back2dos

2
@ back2dos: prosimy o opublikowanie odpowiedzi zamiast wielokrotnego pozostawiania tego samego komentarza.
Ed S.

4
@Ed S. Nawet nie próbowałeś odpowiedzieć na pytanie. Powiedziałeś coś oczywistego, na co oryginalny plakat prawie na pewno znał już odpowiedź. Jak mówią moderatorzy, nie o to nam chodzi. Aby uzyskać więcej informacji, zobacz meta.programmers.stackexchange.com/questions/1968/ ...
btilly,

@ back2dos, btilly - Odpowiedzi na stronach Stackexhange są nie tylko dla OP, stają się trwałym zasobem dla każdego przechodzącego czytelnika. Wszystkie oczywiste fakty niekoniecznie są oczywiste dla wszystkich, jeśli ta odpowiedź pomoże upuścić grosz komuś, kogo ma wartość.
ocodo

2
@ Slomojo przez ten argument, każde pytanie może stać się wiki dla każdego pokrewnego aspektu tematu. Chodzi o to, że to nie odpowiada na pytanie . Ta odpowiedź z pewnością może być poprawna gdzie indziej, na „Jak szybko przekonwertować mentalnie na ósemkę?”
Nicole,

2

Nie. Nigdy ich nie użyłem. Nawet do ustawiania uprawnień do plików, ponieważ robię to tak rzadko, że trudno mi je odczytać.

Więc tak, istnieje oczywista korzyść z konwersji zi na binarną.
Jednak, jak już wskazał @Mason, hex jest znacznie bardziej „naturalny”, ponieważ 2 cyfry hex tworzą jeden bajt. Przydaje się do reprezentowania 24/32 bitowych kolorów RGB / ARGB, adresów IP, masek bajtów itp. Oktal po drugiej stronie nie jest tak naprawdę praktyczny, ponieważ rzadko masz scenariusze, w których pracujesz w grupach 3-bitowych.

Uprawnienia do plików to tak naprawdę jedyna rzecz, o której mogłem pomyśleć. A jeśli na razie nie ma obszaru zastosowania, wątpię, by kiedykolwiek istniał. Ponieważ w ciągu ostatnich 20 lat przestrzeń stała się tak tania, bardzo rzadkie stało się tak ścisłe pakowanie informacji, kosztem dostosowania, łatwości użytkowania i rozszerzalności.


2

Trochę na bok, ale publiczny użytek znajduje się w londyńskim metrze. Każdy pociąg ma zarówno fizyczną tożsamość, jak i oddzielną tożsamość w rozkładach jazdy, która jest wyświetlana podczas eksploatacji - patrz tutaj: https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (zwróć uwagę na 402 u góry ekranu docelowego). Chociaż elektronika wyświetlaczy jest oparta na standardowym formacie dziesiętnym, nigdy nie widać cyfr 8 lub 9, ponieważ są one powiązane ze starszym sprzętem opartym na oktale w systemie sygnalizacyjnym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.