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.