8 진은 어디에 유용합니까? [닫은]


36

PHP에서 완전히 이상한 버그를 보면서 약 20 분 동안 테이블에 머리를 부딪 혔다가 8 진수가 있음을 깨달았습니다. <% (* & #> 8 진.

요컨대, 코드가 정렬 될 수 있도록 리터럴을 0으로 채웠습니다. 8 진수를 잊어 버렸습니다.

문제는 누구나 파일 권한 이외의 다른 용도로 8 진법을 사용합니까? (개인적으로 선호 chmod ugo+rwx하지만 프로그래밍 방식으로 생성 해야하는 경우 8 진수를 사용하는 것이 유용하다는 것을 알고 있습니다.) 그러나 다른 상황에서도 유용합니까?


16
옵션 A : 스스로를 비난하십시오. 옵션 B : 세상을 비난하십시오. 옵션 C : 당신이 무언가를 배웠을 때 허풍.
Job

12
@Petrozza-IMO 8 진수를 나타내는 C 스타일의 사용은 결코 좋은 선택이 아니었지만 역사는 아마도 C 역사의 일부일 것입니다. 나는 Ada가 더 나은 규칙 중 하나를 가지고 있다고 생각합니다 .8 진수는 8 # 1234567 #, 16 진수 16 # abcdef # 등으로 작성되며 선행 0은 단지 선행 0입니다. 시각적으로 명확하고 이해하기 쉽습니다.
Steve314

2
@Petruza 원래 형태의 질문은이 사이트에 대해 건설적인 것이 아니며 커뮤니티가 공개 된 상태로 유지할 수 있도록 개선되었습니다. 사람들이 왜 그렇게하는지에 대한 자세한 내용은 FAQ참조하십시오 . 추가 질문이나 문제 가 있으면 질문이 아닌 메타 토론 사이트 에서 제기하십시오.

11
옵션 D : "비난 PHP"는 문제와 상관없이 항상 올바른 선택입니다
Cephalopod

2
@ Steve314 전적으로 동의합니다. 또 다른 주목할만한 예는 그들이 가지고 파이썬이다 0o(과 일치하는 접두사 0x0b구별하기 그러나 아마 조금 하드를 00). 그리고 파이썬 3 이후로, 앞에 오는 0은 이런 종류의 버그를 막기위한 구문 오류입니다.
5gon12eder

답변:


42

Wikipedia 에 따르면 , 8 진은 예전처럼 일반적이지 않습니다. 다른 사람들이 이미 언급했듯이 과거에는 12/24/36 비트 단어를 사용하는 시스템이 16 진수보다 8 진수로 더 쉽게 표현되지만 현재 x86 및 i64 아키텍처는 16/32/64 비트를 사용합니다. 이 단어는 16 진법으로 표현되고 8 진법으로 추악하게 표현됩니다.

그러나 현재의 용도는 다음과 같습니다.

현대의 프로그래밍 언어는 사용 사례가 부족하고 버그가 발생할 가능성 때문에 더 이상 8 진법을 지원하지 않습니다. Eric Lippert가 TCPL 3rd and 4th edition에서이 글을 썼을 때 C #이 그 예입니다 .

C #은 두 가지 이유로 8 진 리터럴을 지원하지 않습니다. 첫째, 요즘 8 진법을 사용하는 사람은 거의 없습니다. 둘째, C #에서 표준 "선행 0은 8 진수"형식으로 8 진수를 지원하면 오류의 원인이 될 수 있습니다. 이 코드를 고려하십시오.

    FlightNumber = 0541;

분명히이 표현은 8 진 리터럴이 아닌 10 진 리터럴로 의도 된 것입니다.

관련, 그냥 참조 및 호기심에 대한 코드, 컴퓨터 하드웨어의 숨겨진 언어 진수와 다른 번호 시스템에서 우수한 쉬운 후속 설명이 55 페이지의 - (63) .


1
이 메모에서 사용자 입력을 처리 할 때 Javascript를주의하십시오. parseInt(011)==9
Darien

3
유키와 파마 인은 정말 흥미 롭습니다. 당신이, 각 손가락의 안쪽을 사용하는 경우 그 진수 손가락 계산이 쉽게 합리적이고 나에게 발생 과 같이 몇 가지 변화를 사용하여
ocodo

@Slomojo-당신은 실제로 당신의 손가락에 99까지 셀 수 있습니다 ...
detly

3
매우 포괄적 인 답변은 +1입니다. Grace Hopper는 한 번에 8 진수를 추가하는 데 능숙 해져서 수표 균형을 맞추는 데 문제가 있다고 말했습니다.
Macneil

14
@detly, 큰 숫자를 계산해야한다는 것을 알고 있다면 10 자리를 비트로 사용하고 손가락으로 1024까지 계산합니다 (# 4, # 128 및 # 132를 표시하는 사람은 조심하십시오).
zzzzBov

17

Octal은 약 50 년 전에 DEC (Digital Equipment Corp.) 및 12 비트 단어 (예 : PDP-8) 또는 18과 36과 같은 6의 배수 (예 : UNIVAC 1108)를 가진 다른 회사에서 널리 사용했습니다. ). 저는 대학원에서 PDP-8과 UNIVAC 1108을 모두 사용했습니다. 두 머신의 문자는 일반적으로 8이 아닌 6 비트를 사용했습니다.

PDP-8 명령 형식

PDP-8 명령 형식-비트 번호는 0-> 11입니다. 비트 0은 MSB (가장 중요한 비트)였습니다.

DEC가 16 비트 PDP-11과 함께 나왔을 때, 그들은 다른 미니 컴퓨터 제조업체들이 당시에 16 비트 기계와 함께 나오는 16 진수 대신 8 진수를 문서에서 계속 사용했습니다. 이는 PDP-11 명령어 형식 (레지스터, 모드 및 Src / Dest)과 같은 8 비트 숫자로 디코딩 될 수있는 여러 3 비트 필드 때문일 수 있습니다. (John Strohm에게 이것을 지적 해 주셔서 감사합니다.)

흥미롭게도 Motorola가 PDP-11의 영향을 많이 받고 지침에 동일한 3 비트 모드 및 레지스터 필드가있는 68000 마이크로 프로세서를 출시했을 때 설명서에서 16 진수 만 사용하기로 선택했습니다.

PDP-11은 8 진수 표기법을 사용했기 때문에 PDP-11에 처음 나타난 Unix의 원래 허가 코드는 8 진수를 사용했습니다. 이 레거시는 Linux에서 지속되며 chmod 명령은 여전히 ​​8 진수를 사용하여 3 비트 'rwx'필드 각각을 지정합니다.

좀 더 사소한 일-CompuServe는 1980 년대와 1990 년대 초에 AOL에 의해 섀도 잉되기 전에 널리 사용 된 전화 접속 온라인 서비스 였지만 최소한 원래 DEC 미니 컴퓨터에서 실행되었습니다. 모든 사용자 ID는 숫자였으며 어느 시점에서 8 또는 9를 포함하지 않았으므로 8 진수였습니다. 예전 CIS ID는 70205였습니다.


1
PDP-11 문서에 대한 귀하의 의견이 올바르지 않습니다. PDP-11에는 8 개의 레지스터가 있습니다. R0-R5는 범용 레지스터입니다. R6은 스택 포인터이고 R7은 PC입니다. MOV 명령에는 2 개의 3 비트 레지스터 번호와 2 개의 3 비트 주소 지정 모드가 사용되었습니다. Octal은 레지스터 및 모드 필드를 완벽하게 캡처합니다. (이것이 우연 인 것이 확실합니다.) 16 진수를 사용하면 모든 것이 혼란 스러울 것입니다. PUSH와 POP은 R6을 사용하는 주소 지정 모드 일뿐입니다. 즉시 피연산자는 R7을 사용한 주소 지정 모드입니다.
John R. Strohm

@ JohnR.Strohm 3 비트 레지스터에 대한 의견에 감사드립니다. 귀하의 분석에 동의하며 답변을 업데이트했습니다.
tcrosley

그래서 DEC는 OCT에서 일했습니다. 혼동을 피하기 위해 3.32 비트의 배수를 사용해야합니다.
user234461

유닉스 사용 권한을 8 진수로 간주하지 않은 방법이 재미 있습니다. 항상 3 개의 개별 숫자 (각각 3 개의 rwx 비트를 나타냄)로 생각했기 때문에 8 진수, 10 진수 또는 16 진수 일 수 있습니다.
axl

11

Heathkit은이를 H-8의 전면 패널과 전면 패널 소프트웨어 (PAM-8이라고 함)의 어셈블리 언어 목록에 사용했습니다. 나 자신을 데이트, 알아

여기에 이미지 설명을 입력하십시오

오늘날 8 진은 매우 드 rare니다. 모두 16 진수를 사용하는 것 같습니다. 그러나 숫자는 여전히 8 진수의 숫자처럼 보이며 숫자 A에서 F까지의 추가 키 행이 필요하지 않습니다.


2
H-8의 경우 +1 CPU는 외부에서 8 진이지만 8080A로 모든 바이트였습니다. 가자
Blrfl

나는 그들이 H-11 (PDP-11 CPU를 가짐)과의 공통성을 위해 8 진수를 사용했다고 생각합니다.
Jerry Coffin

2
8080은 8 비트 바이트를 가졌지 만 16 진수보다 8 진수로 보면 명령어 세트가 더 의미가 있습니다.
RBerteig

6

8 진수가 사용되는 이유 중 하나는 특수 문자가 필요하지 않은 2의 거듭 제곱 인 가장 큰 밑수이므로 모든 숫자가 숫자 일 수 있기 때문입니다. 기수 16 (기수 8에서 다음 숫자)에는 숫자가 아닌 숫자 (보통 A, B, C, D, E, F)가 필요합니다.


나는 이것이 오래되었다는 것을 알고 있지만 왜 숫자 만 사용하는 것이 문자를 사용하는 것보다 선호됩니까?
Petruza

5

나는 매일 8 진법을 사용합니다. 파일을 chmod해야 할 때마다 8 진법을 사용합니다 (u + r 표기법을 먼저 사용합니다 ...). 문자열에 제어 문자를 포함시키고 싶을 때마다 8 진법을 사용합니다 ...


2
"하지만 8 진수는 내가 사용하는 것"에 +1 :)
JoelFan

5

3 개로 그룹화 된 비트 조합을 표현해야하는 사람.

왜 16 진수를 사용합니까?


8 진수로 표현되는 내 머리 꼭대기의 것들 :

  • 비행기의 모드 3A 트랜스 폰더에 의해 뭉개지는 코드
  • ARINC 429 항공 버스에서 발견 된 특정 값
  • SCSI 주소
  • ncurses라이브러리의 키 코드

11
차이점은 16 진은 반 바이트로 "자연"입니다. 2 개의 16 진수 = 1 바이트 그러나 바이트를 8 진수로 나눌 수 없습니다.
메이슨 휠러

2
첫 번째 줄에는 명백한 내용이 나와 있습니다. 두 번째는 비유가 좋지 않습니다.
back2dos

3
그리고 16 진수는 위에서 언급 한 Unix 파일 모드와 같이 3 비트 그룹으로 표현해야하는 모든 것이 부자연 스럽습니다. 특정 번호 체계의 숫자가 바이트와 일치해야한다는 법칙은 없습니다. 만약 있다면,베이스 10으로 컴퓨터에 무엇인가를 표현하는 것은 적어도 8 비트 그룹과 정렬되는베이스 8보다 나쁜 연습이 될 것입니다.
Blrfl

6
일반적인 16 진 문자열은 분명히 16 진 문자열입니다. 8 진수는 아닙니다.
Paul Nathan

1
@Blrfl : "3 비트 그룹으로 표현해야 할 것들"이 정식 예제와는 얼마나 다른가? 이것이 실제 질문인데, 지금까지 답변하지 않았습니다. 대신 당신은 또 다른 가난한 비유를합니다. 이 실제 사용 우리는 단순히 그것을 처리하는 것을 배웠다 때문에 소수점 표현은. 어느 것 당신이 빠르게 계산? 7 * 6또는 07 * 06? 우리는 10 진수를 사용하여 숫자를 가장 잘 처리 할 수 ​​있고 16 진수는 기계가 숫자를 저장하는 방법과 매우 가까운 숫자를 나타냅니다. 그리고 우리는 이것을 많이합니다. 이 사이트는 그 증거로 가득합니다.
back2dos

5

CDC 메인 프레임 (60 비트 워드, PPU의 경우 12 비트 워드)으로 작업했을 때 모든 코어 덤프는 8 진수 (워드 당 20 8 진수, PPU 워드 당 4)로 수행되었습니다.


3

16 진과 마찬가지로 8 진 표기법은 문자 코드를 지정하는 데 사용되기도합니다. 16 진수와 같은 이유로 편리 할 수 ​​있습니다. 이진보다 더 작지만 머리에서 이진으로 번역하는 것은 매우 쉽습니다.


2

16 진수와 마찬가지로 8 진수는 이진수에서 쉽게 변환 할 수 있습니다. 이진수를 오른쪽에서 시작하여 세 그룹으로 그룹화하십시오.

10010101110  // binary

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

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

7
이것은 분명하다. 문제는 이것이 언제 실제로 사용 되는지에 관한 것 입니다.
back2dos

2
@ back2dos : 그런 다음 동일한 의견을 여러 번 남기지 않고 답변을 게시하십시오.
Ed S.

4
@ Ed S. 당신은 질문에 대답하지 않았다. 당신은 원래의 포스터가 거의 확실하게 답을 알고 있다는 것을 분명히 말했습니다. 중재자가 말하는 것을 좋아하기 때문에 이것은 우리가 촬영하는 것이 아닙니다. 자세한 내용은 meta.programmers.stackexchange.com/questions/1968/… 를 참조하십시오 .
btilly

@ back2dos, btilly-Stackexhange 사이트에 대한 답변은 OP를위한 것이 아니라 모든 독자에게 지속적인 리소스가됩니다. 이 답변 이 가치가있는 사람 의 페니 드롭 에 도움이된다면 모든 명백한 사실이 모든 사람에게 분명하지는 않습니다 .
ocodo

2
@Slomojo는 그 주장에 의해 모든 질문이 주제의 모든 관련 측면에 대한 위키가 될 수 있습니다. 요점은 이것이 질문에 대답하지 않는다는 것 입니다. 이 답변은 "어떻게 정신적으로 8 진수로 빠르게 변환 하는가?"
Nicole

2

아니. 사용하지 마십시오. 파일 권한을 설정하지 않아도 읽기가 어렵습니다.

그렇습니다. 바이너리에서 바이너리로 변환하는 것의 명백한 이점이 있습니다.
그러나 @Mason이 이미 지적했듯이 16 진수는 2 바이트 숫자가 1 바이트를 만들기 때문에 훨씬 "자연적"입니다. 24/32 비트 RGB / ARGB 색상, IP 주소, 바이트 마스크 등을 나타내는 데 편리합니다. 다른 쪽의 8 진법은 3 비트 그룹으로 작업하는 시나리오가 거의 없기 때문에 실제로는 실용적이지 않습니다.

실제로 파일 권한은 내가 생각할 수있는 유일한 것입니다. 그리고 현재 사용 영역이 없다면, 하나도 없을 것입니다. 지난 20 년 동안 공간이 매우 저렴 해 졌기 때문에 정렬, 사용 편의성 및 확장 성으로 인해 정보를 매우 엄격하게 포장하는 것은 매우 드문 일이되었습니다.


2

조금은 제쳐두고 있지만, 대중은 런던 지하철에 있습니다. 각 열차는 실제 신원과 운행 중 표시되는 일정에 별도의 신원이 있습니다. 여기를 참조하십시오 : https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (대상 디스플레이 상단의 402 참고). 디스플레이 용 전자 장치는 표준 10 진수 기반이지만 신호 시스템의 레거시 8 진수 기반 하드웨어에 연결되어 있기 때문에 숫자 8 또는 9는 표시되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.