16 진 숫자 앞에 0x가 붙는 이유는 무엇입니까?


414

16 진수가 접두사로 붙는 이유는 무엇 0x입니까? 접두사의 사용법을 이해하지만 왜 0x선택된 이유의 중요성을 이해하지 못합니다 .


9
이제 제목과 텍스트가 완전히 다른 두 가지 질문을한다는 것을 알고 있습니다. 대부분의 답변은 제목의 질문에 중점을 둡니다. 본문의 질문에 대한 대답은 단순히 "무엇을 의미하는 것이 아닙니다. 정수는 16 진수로 쓰여졌다는 것을 컴파일러에게 알려주는 접두사 일뿐"입니다.
— Andreas Rejbrand

30
놀랍게도 제목의 질문을 두 가지 다른 방식으로 해석 할 수도 있습니다. 1) "16 진수는 왜 다른 접두사 나 지표가 아닌 0x로 시작합니까?" 2) "16 진수를 입력 할 때 왜 접두사를 사용해야합니까? 분명히 컴파일러는 접두사가없는 경우에도 58A를 16 진수로 인식합니까?" 질문의 두 번째 해석에 대한 답은 사소합니다. "123"도 16 진수입니다.
— Andreas Rejbrand

답변:


440

짧은 이야기 : (가) 0는 상수 (그리고 식별자 / 예약 된 단어)를 다루는 것 파서를 알려줍니다. 수 기준을 지정하려면 무언가가 여전히 필요합니다 x. 임의 선택입니다.

긴 이야기 : 60 년대에 널리 사용 된 프로그래밍 수 시스템은 10 진수 및 8 진수입니다 . 메인 프레임은 바이트 당 12, 24 또는 36 비트를 가졌으며 이는 3 = log2 (8)로 나눌 수 있습니다.

BCPL 언어 8 1234는 8 진수 의 구문 을 사용했습니다 . Ken Thompson은 BCPL에서 B를 만들 때 0대신 접두사를 사용했습니다. 이것은 대단하기 때문에

  1. 정수 상수는 항상 단일 토큰으로 구성됩니다.
  2. 파서는 여전히 상수가 있다고 즉시 알 수 있습니다.
  3. 파서는 즉시 기지를 말할 수 있습니다 ( 0두 기지에서 동일합니다).
  4. 수학적으로 제정신 ( 00005 == 05)이며
  5. 귀중한 특수 문자는 필요하지 않습니다 (에서처럼 #123).

C가 B에서 만들어 졌을 때 16 진수가 필요 해졌고 (PDP-11에는 16 비트 단어가 있음) 위의 모든 사항이 여전히 유효했습니다. 다른 기계에는 8 진수가 여전히 필요했기 때문에 0x임의로 선택되었습니다 ( 00아마도 어색한 것으로 간주).

C #은 C의 자손이므로 구문을 상속합니다.


112
나는 0x이상 00이 선호 / 어색함 이라고 생각하지 않습니다 . 00기존 코드를 깨뜨릴 수 있습니다. 0010진수이기 때문에 8, 상태를 001016 진수는 것 같은 16. 그들은 숫자를 두 번째 숫자 표시기로 사용할 수 없었습니다 ( 8또는 제외하고 916 진수와 관련된 의미를 갖지 않습니다). 그리고 그 잎 하나 0h또는 0x( H 전자 X idecimal). 이 시점에서 그것은 다시 선호로 돌아온 것 같습니다.
— GManNickG


23
08 진수 로 접두사를 사용 하면 수년 동안 매우 많은 문제가 발생했습니다. 특히 전화 번호가로 시작하는 영국과 같은 국가에서는 0. 자바 스크립트와 다른 많은 언어들은 이것을 8 진수로 파싱하여 저장하기 전에 숫자를 조정합니다. 재미에 추가하려면, 하나 개의 인기있는 데이터베이스 제품은 것이다 자동으로 숫자가 포함 된 경우 소수점 파싱로 전환 8하거나 9.
— 기본

1
12, 24, 36도 4로 나눌 수 있는데 왜 16 진수를 생각하지 않았습니까?
— phuclv

4
@ LưuVĩnhPhúc 아마도 16 진이 관련이 없기 때문일 것입니다. 시간의 대부분의 하드웨어, 소프트웨어 및 문서는 8 진에 훨씬 적합합니다. BCPL은 36 비트 IBM 7094 에서 처음 구현되었으며 명령 형식은 두 개의 3 비트 부분과 2 개의 15 비트 부분으로 나뉩니다. 6 비트 문자; 그리고 8 진수로 된 문서. B의 초기 구현은 PDP-7 (18 비트) 및 Honeywell GE-945 (36 비트, 18 비트 주소 지정 및 6 비트 및 9 비트 바이트 지원)에서 수행되었습니다. 16 비트 PDP-11은 B 이후에 나왔으므로 B의 디자인에는 큰 영향을 미치지 않았을 것입니다.
— 8bittree

97

참고 : 나는 정답을 모르지만 아래는 내 개인적인 추측입니다!

앞에서 언급했듯이 숫자가 0이면 8 진수를 의미합니다.

04524 // octal, leading 0

16 진수를 나타내는 시스템이 필요하다고 가정하고 C 스타일 환경에서 작업하고 있음을 참고하십시오. h와 같은 어셈블리로 끝나는 것은 어떻습니까? 불행히도 할 수는 없습니다-유효한 식별자 인 토큰을 만들 수 있습니다 (예 : 변수 이름을 같은 것으로 지정할 수 있음).

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

같은 이유로 캐릭터를 이끌 수 없습니다.

xFF00 // also valid identifier

전처리 기와 충돌하기 때문에 해시를 사용했을 수 있습니다.

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

결국, 어떤 이유로 든 그들은 선행 0 뒤에 x를 두어 16 진을 표시하기로 결정했습니다. 여전히 숫자 문자로 시작하기 때문에 모호하지 않으므로 유효한 식별자가 될 수 없으며 아마도 선행 0의 8 진 규칙을 기반으로합니다.

0xFF00 // definitely not an identifier!

3
흥미 롭군 나는 그들이 16 진수를 나타 내기 위해 선행 0과 후행 h를 사용할 수 있다고 상상합니다. 후행 h는 아마도 타입 지정자 접미사와 혼동되었을 것입니다. 예 : 0xFF00l vs 0FF00hl
— zdan

2
이 인수는 8 진수를 나타 내기 위해 선행 0을 사용하면 16 진 "0x"접두어를 사용하기 전에 시작됩니다. 이것이 사실입니까?
— Andreas Rejbrand

1
둘 다 동시에 발명되지 않았습니까? 왜 하나는 있지만 다른 하나는 없었을까요?
— AshleysBrain

AshleysBrain은 동시에 @ 8 진법이지만 16 진법이없는 이유는 @ Řrřola의 답변을 참조하십시오.
— jv42

2
@zdan 그들은 오래 전에 그것을 사용했습니다. x86 Intel 어셈블리에서 16 진 리터럴은 문자로 시작하는 경우 항상 0으로 시작해야합니다. 예를 들어 0xFFAB1234로 작성해야합니다 0FFAB1234h. 어렸을 때 파스칼의 인라인 asm에서 기억합니다. stackoverflow.com/q/11733731/995714
— phuclv

27

숫자가 다른 기본이 아닌 16 진수임을 나타내는 접두어입니다. C 프로그래밍 언어는이를 사용하여 컴파일러에 알립니다.

예:

0x6400로 변환 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. 컴파일러는 읽을 때 0x6400, 그것은 수의 도움으로 16 진수 이해 0X 용어. 보통 우리는 (6400) 16 또는 (6400) 8 또는 무엇이든 이해할 수 있습니다 .

들어 진 이 될 것이다 :

0b00000001

어떤 식 으로든 도움이 되었기를 바랍니다.

좋은 날!


2
이진 리터럴은 C ++ 14 이후 C ++에서만 지원되며 C에서는 전혀 지원되지 않습니다.
— Ruslan

1
왜 그런지 설명하지 않습니다 . 특히 첫 번째 예제를 왜 이렇게 쓸 수 없었 x6400습니까? 은 x여전히 진수를 추론하는 데 사용할 수 있습니다.
— Aaron Franke

12

앞의 0은 밑 2, 8 또는 16의 숫자를 나타내는 데 사용됩니다.

내 생각에, 'x'는 16 진처럼 들리므로 16 진을 나타 내기 위해 0x가 선택되었습니다.

단지 내 의견이지만, 나는 그것이 의미가 있다고 생각합니다.

좋은 날!


2
답변 해주셔서 감사합니다! 이것이 StackOverflow의 첫 번째 게시물이라는 것을 알고 있습니다. 의견이 사실과 분리되어 있으면 답변이 더 도움이 될 수 있습니다.
— vivek_ganesan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.