문제

이 모든 시간 후에, 나는이 질문을하지 않을 생각을 한 적이 없다. 나는 이것이 C ++에서 나온 것을 이해하지만 그 뒤에있는 이유는 무엇입니까?

  • 평소와 같이 소수점 번호를 지정하십시오
  • 주요 0으로 Octal 번호를 지정하십시오
  • 주요 0x로 16 진수를 지정하십시오

왜 0? 왜 0x인가? Base-32의 자연스러운 진행이 있습니까?

도움이 되었습니까?

해결책

C ++와 Java의 조상 인 C는 원래 70 년대 초 PDP-8에서 Dennis Richie에 의해 개발되었습니다. 그 기계에는 a 12 비트 주소 공간, 포인터 (주소)의 길이는 12 비트이고 가장 편리하게 3 개의 4 비트 옥탈 숫자로 코드로 표시됩니다 (첫 번째 주소가 가능한 단어는 000octal, 마지막 주소가 가능한 단어 777octal)입니다.

각각의 옥탈 숫자는 3 비트를 나타내므로 옥탈은 8 비트 바이트에 잘 매핑되지 않으므로, 옥탈 표기법에 항상 초과 비트가 나타날 것입니다. 전처리 바이트 (1111 1111)는 10 대에서 377이지만 16 진수에서는 FF입니다.

이진수는 일반적으로 8 개의 블록으로 표현되기 때문에 16 진수는 대부분의 사람들이 머리의 이진을 오가는 것이 더 쉽습니다. 그리고 데니스의 시간에 오해의 소지가 있습니다 (16 비트를 다루는 능력을 암시). 프로그래머는 하드웨어로 작업 할 때 (각 비트가 일반적으로 물리적 와이어를 나타내는) 비트 현저한 로직 (각 비트가 프로그래머 정의 의미를 갖는)으로 작업 할 때 바이너리를 생각해야합니다.

Dennis는 0 접두사를 일상 소수점 숫자에서 가장 간단한 변형으로 추가했으며 초기 파서가 구별하기가 가장 쉽다고 생각합니다.

HEX 표기법 0x__가 나중에 C에 약간 추가되었다고 생각합니다. 컴파일러 구문 분석 트리는 1-9 (십진 상수의 첫 번째 숫자), 0 (Octal Constant의 첫 번째 [무의미한] 숫자) 및 0x (이후 숫자로 따라야 할 육각 상수를 나타내는)를 구별하는 트리 트리가 상당히 더 많습니다. 소수점이 아닌 후속 숫자를 구문 분석에서 전환하는 지표로 선행 0을 사용하는 것보다 복잡합니다.

데니스가 왜 이런 식으로 디자인 했습니까? 현대 프로그래머 이 초기 컴퓨터는 CPU 전면 패널의 물리적으로 스위치를 뒤집거나 펀치 카드 또는 종이 테이프를 사용하여 CPU에 지침을 토글함으로써 종종 제어되었다는 것을 인식하지 마십시오. 몇 단계 나 지시를 절약하는 모든 환경은 중요한 수동 노동의 절약을 나타냅니다. 또한 메모리는 제한적이고 비싸므로 몇 가지 지침조차도 저장하면 가치가 높았습니다.

요약 : 10 월의 경우 0은 PDP-8에서 효율적으로 진정성이 있었고 Octal은 사용자 친화적이었습니다 (적어도 주소 조작의 경우)

0x Hex의 경우 0x 아마도 Octal Prefix 표준에서 자연스럽고 후진 호환 확장이었고 여전히 구문 분석하는 데 비교적 효율적입니다.

다른 팁

옥탈의 제로 접두사, 16 진수의 경우 0x는 유닉스의 초기에 나온 것입니다.

10 대가 존재하는 이유는 6 비트 바이트가있는 하드웨어가 있었을 때까지 날짜가 발생하여 옥탈을 자연스럽게 선택했습니다. 각 옥탈 숫자는 3 비트를 나타내므로 6 비트 바이트는 2 개의 옥탈 숫자입니다. 육각 숫자는 4 비트이며 바이트는 2 개의 16 진수수입니다. 8 비트 바이트에 Octal을 사용하려면 3 개의 옥탈 숫자가 필요하며, 그 중 첫 번째는 값 0, 1, 2 및 3만을 가질 수 있습니다 (첫 번째 숫자는 실제로 'tetral'입니다. 누군가가 바이트의 길이가 10 비트 인 시스템을 개발하지 않는 한 Base32로 갈 이유가 없으므로 10 비트 바이트는 2 개의 5 비트 "nybbles"로 표시 될 수 있습니다.

"새로운"숫자는 기존 구문과 함께 작동하기 위해 숫자로 시작해야했습니다.

확립 된 관행에는 편지로 시작하는 가변 이름 및 기타 식별자가있었습니다 (또는 몇 가지 다른 기호, 밑줄 또는 달러 표시). 따라서 "A", "ABC"및 "A04"는 모두 이름입니다. 숫자는 숫자로 시작되었습니다. 따라서 "3"과 "3e5"는 숫자입니다.

프로그래밍 언어에 새로운 것을 추가하면 기존 구문, 문법 및 의미론에 맞게 만들고 기존 코드가 계속 작동하도록 노력합니다. 따라서 구문을 변경하여 "x34"를 16 진수 또는 "O34"로 만들기 위해 Octal 번호를 만들고 싶지 않습니다.

그렇다면이 구문에 옥탈 숫자를 어떻게 장착합니까? 누군가는 "0"을 제외하고 "0"으로 시작하는 숫자가 필요하지 않다는 것을 깨달았습니다. 아무도 123에 대해“0123”을 쓸 필요가 없습니다. 따라서 우리는 주요 숫자를 사용하여 Octal 숫자를 나타냅니다.

16 진수 숫자는 어떻습니까? 접미사를 사용할 수 있으므로 "34x"는 34를 의미합니다.16. 그러나 파서는 숫자를 해석하는 방법을 알기 전에 숫자 끝까지 모든 것을 읽어야합니다 (“A”중 하나를“F”숫자 중 하나에 만나지 않는 한, 물론 16 진수를 나타냅니다). 파서에서 숫자가 16 진수임을 아는 것은 구문 분석기에서 "더 쉬운"것입니다. 그러나 여전히 숫자로 시작해야하며 제로 트릭이 이미 사용되었으므로 다른 것이 필요합니다. “X”가 선택되었고 이제 우리는 16 진수를위한“0x”가 있습니다.

(위의 것은 컴파일러 개발자 또는 언어위원회의 특정 결정에 대한 지식이 아니라 언어 개발에 대한 구문 분석과 일부 일반적인 역사에 근거합니다.)

나는 몰라 ...

0은 0ctal입니다

0x는 이미 0을 사용하기 위해 0을 사용했으며 16 진수에는 x가 있으므로 거기에도 그 버가 있습니다.

자연스러운 진행은

123_27 (첨자 평균 _ 해석)

등등

?

표시

Base-32의 자연스러운 진행이 있습니까?

이것이 ADA가 양식 16#을 사용하여 육각 상수, 8#의 경우 8#, 이진의 경우 2# 등을 소개하는 이유 중 일부입니다.

나는 기초에 "미래의 성장"을위한 공간이 필요한 것에 대해 너무 걱정하지 않을 것입니다. 이것은 모든 세대를 더 많이 필요로하는 램이나 주소 지정 공간과 다릅니다.

사실, 연구는 옥탈과 16 진수가 거의 스위트 스팟 이진과 호환되는 사람이 읽을 수있는 표현의 경우. 옥탈보다 낮게 들어가면 더 많은 숫자를 나타 내기 위해 숫자의 숫자가 필요합니다. 16 진수보다 높으면 수학 테이블이 꾸준히 커집니다. 16 진수는 실제로 이미 너무 많지만 Octal은 바이트에 균등하게 맞지 않는 문제가 있습니다.

표준 인코딩이 있습니다 베이스 32. 그것은 매우 유사합니다 베이스 64. 그러나 읽는 것이 편리하지 않습니다. 16 진수 숫자는 1 8 비트 바이트를 나타내는 데 사용될 수 있기 때문에 16 진수가 사용됩니다. 그리고 Octal은 주로 사용한 이전 시스템에 사용되었습니다. 12 비트 바이트. 원시 레지스터를 이진으로 표시하는 것과 비교할 때보다 컴팩트 한 데이터를 표현할 수있었습니다.

또한 일부 언어는 Octal 및 x ## 또는 H ## 및 16 진수의 경우 O ### 및 기타 많은 변형을 사용한다는 점에 유의해야합니다.

나는 그것을 생각한다 0x 실제로 UNIX/Linux 세계에 왔으며 C/C ++ 및 기타 언어에 의해 선택되었습니다. 그러나 나는 정확한 이유 나 진정한 기원을 모른다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top