수학(mathematics)과 컴퓨팅(computing)에서, 십육진수(hexadecimal) (역시 base-16 또는 hex) 숫자-표시 시스템은 16의 기수 (밑수)를 사용하여 숫자를 나타내는 위치적 숫자 시스템입니다. 10 기호를 사용하여 숫자를 나타내는 십진 시스템과 달리, 십육진수는 16 구별되는 기호를 사용하며, 가장 자주 기호 "0"-"9"는 0에서 9까지의 값을 나타내고 "A"-"F" (또는 대안적으로 "a"-"f")는 10에서 15까지의 값을 나타냅니다.
십육진 숫자 시스템은 컴퓨터 시스템 디자이너와 프로그래머에 의해 광범위하게 사용되는데 왜냐하면 그것들은 이진-코드(binary-coded) 값의 보다 인간-친화적 표현을 제공하기 때문입니다. 각 십육진 비트는 4 비트 (이진 자릿수)를 나타내며, 역시 니블(nibble, 또는 nybble)이라고 알려져 있습니다. 예를 들어, 8-비트 바이트(byte)는 이진 형식에서 00000000에서 11111111까지 범위의 값을 가질 수 있으며, 이는 십육진수에서 00에서 FF까지로 더 편리하게 나타낼 수 있습니다.
수학에서, 아래-첨자는 전형적으로 밑수를 지정하기 위해 사용됩니다. 예를 들어, 십진 값 28,574는 십육진수에서 6F9E16으로 표현될 수 있습니다. 프로그래밍에서, 여러 가지 표기법이 십육진수 표현을 나타내기 위해 사용되며, 보통 접두사를 포함합니다. 접두사 0x는 C에서 사용되며, 0x6F9E으로 이 값을 나타냅니다.
십육진수는 전송 인코딩 Base16에 사용되며, 여기서 일렉트로닉스(plaintext)의 각 바이트는 두 개의 4-비트 값으로 구분되고 두 개의 16진수에 의해 표시됩니다.
Representation
Written representation
대부분의 현재 사용 경우에서, 문자 A–F 또는 a–f는 값 10–15를 나타내고, 반면 숫자-표시(numerals) 0–9는 그것들의 십진수 값을 나타내기 위해 사용됩니다.
소문자 또는 대문자를 사용하는 보편적인 규칙은 없으므로, 각각은 공동체 표준 또는 규칙에 따라 특정 환경에서 널리 사용되거나 선호됩니다; 심지어 혼합된 경우가 사용합니다. 7-세그먼트 디스플레이는 서로 구별할 수 있는 자릿수를 만들기 위해 혼합된 경우 AbCdEF를 사용합니다.
긴 목록에서 16진수 값을 구분하기 위해 (쉼표나 다른 문장 부호 대신) 공백을 사용하는 일부 표준화가 있습니다. 예를 들어, 다음 16진수 덤프에서, 각 8-비트 바이트는 2-자릿수 16진수이며, 그것들 사이에 공백이 있고, 시작 부분의 32-비트 오프셋은 8-자릿수 16진수입니다.
00000000 57 69 6b 69 70 65 64 69 61 2c 20 74 68 65 20 66
00000010 72 65 65 20 65 6e 63 79 63 6c 6f 70 65 64 69 61
00000020 20 74 68 61 74 20 61 6e 79 6f 6e 65 20 63 61 6e
00000030 20 65 64 69 74 0a
Distinguishing from decimal
밑수가 명확하지 않은 상황에서, 십육진수는 모호할 수 있고 다른 밑수로 표현된 숫자와 혼동될 수 있습니다. 값을 명확하게 표현하기 위한 몇 가지 규칙이 있습니다. 숫자 아래-첨자 (자체는 십진수로 작성됨)는 밑수를 명시적으로 제공할 수 있습니다: \(159_{10}\)은 십진수 159입니다; \(159_{16}\)은 \(345_{10}\)과 같은 십육진수 159입니다. 일부 저자는 \(159_{\rm decimal}\) 및 \(159_{\rm hex}\), 또는 \(159_{\rm d}\) 및 \(159_{\rm h}\)와 같은 텍스트 아래-첨자를 선호합니다.
도널드 커누스(Donald Knuth)는 그의 저서 The TeXbook에서 특정 기수를 나타내기 위해 특정 서체의 사용을 소개했습니다. 십육진수 표현은 타자기 서체(typewriter typeface): 5A3로 작성됩니다.
대부분의 컴퓨터 프로그래밍 환경에서 사용되는 것과 같은 선형 텍스트 시스템에서, 다양한 방법이 발생해 왔습니다:
- 유닉스 (및 관련된) 쉘, AT&T 어셈블리 언어와 마찬가지로 C 프로그래밍 언어 (및 C++, C#, Go, D, Java, JavaScript, Python, 및 Windows PowerShell과 같은 그것의 구문적 자손)은 16진수로 표현되는 숫자 상수에 대해 접두사 0x를 사용합니다: 0x5A3. 문자와 문자열 상수는 접두사 \x 뒤에 두 개의 16진수가 오는 16진수로 문자 코드를 표현할 수 있습니다: '\x1B'는 Esc 제어 문자를 나타냅니다; "\x1B[0m\x1B[25;1H"는 2개의 삽입된 Esc 문자를 갖는 11개의 문자를 포함하는 문자열입니다. printf 함수 계열을 갖는 정수를 16진수로 출력하기 위해, 형식 변환 코드 %X 또는 %x가 사용됩니다.
- URI (URL 포함)에서, 문자 코드(character codes)는 %로 시작하는 16진수 쌍으로 작성됩니다: http://www.example.com/name%20with%20spaces 여기서 %20는 공백 문자, 16진수에서 ASCII 코드 점 20, 십진수에서 32에 대한 코드입니다.
- XML 및 XHTML에서, 문자는 ode;를 사용하여 16진수 수치적 문자 참조(numeric character references)로 표현될 수 있으며, 예를 들어 ’는 문자 U+2019 (오른쪽 작은 따옴표)를 나타냅니다. 만약 x가 없으면 그 숫자는 십진수입니다 (따라서 ’는 십진수 문자입니다).
- 유니코드 표준에서, 문자 값은 U+ 다음에 16진수 값으로 표시되며, 예를 들어, U+20AC은 유로 기호 (€)입니다.
- HTML에서 색깔 참조(Color references), CSS 및 X 윈도우는 #접두사가 붙은 6개의 16진수 자릿수 (순서대로 빨간색, 녹색, 파란색에 대해 각각 2자리)로 표현될 수 있습니다: 흰색은, 예를 들어, #FFFFFF로 표시됩니다. CSS는 역시 구성 요소당 하나의 16진수를 갖는 3-십육진수-자릿수 약어를 허용합니다: #FA3는 #FFAA33 (금색 오렌지: )를 약칭합니다.
- MIME (전자우편 확장자) 인용-인쇄가능 인코딩에서, 문자 코드는 접두사 =가 붙은 16진수 쌍으로 작성됩니다:Espa=F1a는 "España"입니다 (F1 은 ISO/IEC 8859-1 문자 집합에서 ñ에 대한 코드입니다).)
- 인텔-파생 어셈블리 언어 및 Modula-2에서, 16진수는 접미사 H 또는 h로 표시됩니다: 예를 들어, FFh 또는 05A3H. 일부 구현에서는 첫 번째 자릿수 문자가 십진수 자릿수가 아닐 때, 선행하는 영이 필요하므로 FFh 대신 0FFh를 씁니다. 일부 다른 구현 (예를 들어, NASM)은 C-스타일 숫자 (0x42)를 허용합니다.
- 다른 어셈블리 언어 (6502, Motorola), Pascal, Delphi, 일부 버전의 BASIC (Commodore), GameMaker Language, Godot, 및 Forth는 접두사로 $를 사용합니다: 예를 들어, $5A3.
- 일부 어셈블리 언어 (Microchip)는 \(\rm ABCD_{16}\)에 대해 표기법 H'ABCD'를 사용합니다. 마찬가지로, Fortran 95는 Z'ABCD'를 사용합니다.
- Ada 및 VHDL은 기반 "숫자 따옴표"로 십육진수 숫자-표시를 묶습니다: 예를 들어, 16#5A3#. 비트 벡터 상수에 대해, VHDL는 표기법 x"5A3"을 사용합니다.
- Verilog는 8'hFF 형식에서 16진수 상수를 나타내며, 여기서 8은 값의 비트 수이고 FF는 16진수 상수입니다.
- Smalltalk 언어는 접두사 16r를 사용합니다: 예를 들어,16r5A3
- PostScript 및 본 쉘(Bourne shell)과 그것의 파생물은 접두사16#로 십육진수를 나타냅니다: 예를 들어,16#5A3. PostScript에 대해, 이진 데이터 (예를 들어, 이미지 픽셀)은 접두사가 붙지 않은 십육진수 쌍으로 표현될 수 있습니다: 예를 들어, AA213FD51B3801043FBC...
- Common Lisp는 접두사 #x 및 #16r를 사용합니다. 변수 *read-base* 및 *print-base*를 16으로 설정하면 Common Lisp 시스템의 판독기와 프린터를 숫자를 읽고 인쇄하기 위한 16진수 표현으로 전환하는 데 사용할 수도 있습니다. 따라서 입력 또는 출력 밑수가 16으로 변경될 때, #x 또는 #16r 접두어 코드 없이 16진수를 나타낼 수 있습니다.
- MSX BASIC, QuickBASIC, FreeBASIC, 및 Visual Basic은 16진수 숫자로 접두사 &H를 사용합니다: 예를 들어, &H5A3
- BBC BASIC 및 Locomotive BASIC는 16진수에 대해 &를 사용합니다.
- TI-89 및 92 시리즈는 0h 접두사를 사용합니다: 예를 들어, 0h5A3
- ALGOL 68는 16진수 숫자를 나타내기 위해 접두사 16r를 사용합니다: 예를 들어,16r5a3. 이진수, 사진수 (밑수-4), 및 팔진수는 유사하게 지정될 수 있습니다.
- 전통적인 OS (zOS, zVSE, zVM, TPF, IBM i)를 실행하는 IBM 메인프레임 (zSeries), 및 미드레인지 컴퓨터 (IBM i)에서 가장 공통적인 16진수 형식은 X'5A3'이고, 어셈블러, PL/I, COBOL, JCL, 스크립트, 명령어, 및 기타 장소에서 사용됩니다. 이 형식은 다른 (및 지금은 사용되지 않는) IBM 시스템에서도 공통적이었습니다. 때때로 아포스트로피 대신 인용 부호가 사용되었습니다.
- 임의의 IPv6 주소는 4개의 16진수 자릿수 (hextets라고도 함)로 구성된 8개의 그룹으로 작성될 수 있으며, 여기서 각 그룹은 콜론 (:)으로 구분됩니다. 예를 들어 다음은 유효한 IPv6 주소입니다: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 또는 0을 제거함으로써 축약될 수 있습니다: 2001:db8:85a3::8a2e:370:7334 (IPv4 주소는 보통 십진수로 작성됩니다).
- Globally unique identifiers는 종종 하이픈으로 구분된 그룹으로 23 십육진수 자릿수로 쓰입니다: 예를 들어, 3F2504E0-4F89-41D3-9A0C-0305E82C3301.
Other symbols for 10–15 and mostly different symbol sets
9보다 큰 숫자를 나타내기 위해 A에서 F까지의 문자를 사용하는 것은 초기 컴퓨터 역사에서 보편적이지 않았습니다.
- 1950년대 동안, Bendix-14와 같은 일부 설치에서는 10–15 값을 0, 1, 2, 3, 4, 및 5로 표시하기 위해 윗줄과 함께 숫자 0에서 5까지를 사용하는 것을 선호했습니다.
- SWAC (1950) 및 Bendix G-15 (1956) 컴퓨터는 10에서 15 값에 대해 소문자 u, v, w, x, y, 및 z를 사용했습니다.
- ORDVAC 및 ILLIAC I (1952) 컴퓨터 (및 일부 파생된 디자인, 예를 들어, BRLESC)는 10에서 15 값에 대해 대문자 K, S, N, J, F, 및 L을 사용했습니다.
- Librascope LGP-30 (1956)는 10에서 15 값에 대해 문자 F, G, J, K, Q, 및 W를 사용했습니다.
- PERM (1956) 컴퓨터에서, 십육진수 숫자는 영에 대해 문자 O, 1에서 15에 대해 A에서 N과 P를 썼었습니다. 많은 기계 명령어에는 기억법 16진수 코드 (A=더하기, M=곱하기, L=로드, F=고정-점 등)가 있었습니다; 프로그램은 명령어 이름 없이 작성되었습니다.
- Honeywell Datamatic D-1000 (1957)는 10에서 15 값에 대해 소문자 b, c, d, e, f, 및 g를 사용했고, 반면에 Elbit 100 (1967)는 대문자 B, C, D, E, F, 및 G를 사용했습니다.
- Monrobot XI (1960)는 10에서 15 값에 대해 문자 S, T, U, V, W, 및 X를 사용했습니다.
- NEC parametron 컴퓨터 NEAC 1103 (1960)는 10에서 15 값에 대해 문자 D, G, H, J, K (및 아마도 V)를 사용했습니다.
- Pacific Data Systems 1020 (1964)는 10에서 15 값에 대해 문자 L, C, A, S, M, 및 D를 사용했습니다.
- Brookhaven National Laboratory의 Bruce Alan Martin은 A–F의 선택이 "어리석다"고 생각했습니다. 1968년 CACM 편집자에게 보낸 편지에서, 그는 비트 위치에 기반한 완전히 새로운 기호 집합을 제안했습니다.
- 1968년 Boby Lapointe에 의해 Bibi-binary 표기법에 새로운 숫자 기호와 이름을 도입했습니다.
- 1972년 Rowco Engineering Co.의 Ronald O. Whitaker는 "인코딩 행렬에 관계 없이 컴퓨터로부터 입력과 출력을 모두 허용"하기 위해 "직접 이진 읽기"를 허용하는 삼각형 글꼴을 제안했습니다.
- 일부 7-세그먼트 디스플레이 디코더 칩 (예를 들어, 74LS47)은 0–9를 올바르게 생성하도록 설계된 로직으로 인해 예기치 않은 출력을 보여줍니다.
Verbal and digital representations
10에서 15까지의 수량을 나타내기 위한 전통적인 숫자가 없었기 때문에, 알파벳 문자가 대체 문자로 다시 사용되었습니다. 대부분의 유럽 언어에는 11에서 15까지의 일부 숫자-표시에 대한 비-십진수-기반 단어가 부족합니다. 어떤 사람들은 전화 번호와 같은 16진수를 자릿수-별로 읽거나, NATO 음성 알파벳, 합동 육군/해군 음성 알파벳, 또는 이와 유사한 에드-혹(ad-hoc) 시스템을 사용하여 읽습니다. IBM System/360 프로그래머들 사이에서 16진수가 채택된 후 Magnuson (1968)은 16진수 문자에 짧은 이름을 부여하는 발음 가이드를 제안했습니다 – 예를 들어, "A"는 "ann"으로 발음했고, B "bet", C "chris", 등. 또 다른 이름 지정 시스템은 실리콘 밸리의 농담을 기반으로 Babb (2015)에 의해 정교화되었습니다. Rogers (2007)는 실제 숫자에 숫자 A–F가 포함되지 않은 경우에도 어떤 경우에도 구두 표현을 구별할 수 있도록 시도하는 또 다른 이름 지정 시스템을 온라인에 게시했습니다. 예는 아래 표에 나열되어 있습니다.
다른 사람들은 "0000"은 "dit-dit-dit-dit" (....)로 발음되고, dah-dit-dit-dah (-..-)는 9의 값을 갖는 자릿수를 발음하고, "dah-dah-dah-dah" (----)는 십진수 15에 대한 16진수 자릿수를 발음하도록 "dit"와 "dah"가 각각 0과 1을 나타내는 4-비트 16진수 자릿수를 표현하기 위해 구두 모스 부호 규칙을 사용할 것을 제안해 왔습니다.
자릿수를 세는 시스템은 2진수와 16진수 모두에 대해 고안되어 왔습니다. Arthur C. Clarke는 각 손가락을 켜기/끄기 비트로 사용하여, 10개 손가락에서 0부터 \(1023_{10}\)까지 손가락을 세도록 제안했습니다. \(\rm FF_{16}\) (\(255_{10}\))까지 세는 또 다른 시스템이 오른쪽에 나와 있습니다.
Signs
십육진수 시스템은 십진수와 같은 방식으로 음수를 표현할 수 있습니다: −2A는 \(-42_{10}\)을 나타내는 식입니다.
십육진수는 역시 프로세서(processor)에서 사용되는 정확한 비트 패턴을 표현하기 위해 사용될 수 있으므로, 일련의 십육진수 자릿수는 부호화된 값 또는 심지어 부동-점 값을 나타낼 수 있습니다. 이런 방법으로, 음수 \(-42_{10}\)은 32-비트 CPU 레지스터 (2의 보수)에서 FFFF FFD6으로, 32비트 FPU 레지스터에서 C228 0000으로, 또는 (IEEE 부동-점 표준에서) 64-비트 FPU 레지스터에서 C045 0000 0000 0000으로 쓸 수 있습니다.
Hexadecimal exponential notation
십진수를 지수 표기법으로 나타낼 수 있는 것처럼, 십육진수도 마찬가지입니다. P 표기법은 문자 P (또는 "거듭제곱"에 대해, p)를 사용하는 반면 E (또는 e)는 십진수 E 표기법에서 유사한 용도로 사용됩니다. P 뒤의 숫자는 십진수이고 이진 지수를 나타냅니다. 지수를 1씩 늘리면 16이 아니라 2를 곱합니다: 20p0 = 10p1 = 8p2 = 4p3 = 2p4 = 1.0p5. 보통, 숫자는 16진수 자릿수가 1로 시작하도록 정규화됩니다. (영은 보통 P가 없는 0입니다.)
예제: 1.3DEp42는 \(\rm 1.3DE_{16} \times 2^{42_{10}}\)를 나타냅니다.
P 표기법은 IEEE 754-2008 이진 부동-점 표준에 필요하고, C 프로그래밍 언어의 C99 판에서 부동-점 리터럴에 사용될 수 있습니다. %a 또는 %A 변환 지정자를 사용하여, 이 표기법은 C99 사양 및 단일 유닉스 사양 (IEEE Std 1003.1) POSIX 표준을 따르는 함수의 printf 가족의 구현으로 생성될 수 있습니다.
Conversion
Binary conversion
대부분의 컴퓨터는 이진수 데이터를 조작하지만, 인간이 상대적으로 작은 이진수에 대해서도 많은 수의 자릿수로 작업하기는 어렵습니다. 비록 대부분의 사람들은 밑수 10 시스템에 익숙하지만, 각 16진수 자릿수는 정수 비트 (\(4_{10}\))로 매핑되기 때문에 이진수를 십진수로 매핑하는 것보다 십육진수로 매핑하는 것이 훨씬 쉽습니다. 이 예제는 \(1111_2\)를 밑수 10으로 변환합니다. 이진 숫자-표시에서 각 위치는 1 또는 0을 포함할 수 있으므로, 그것의 값은 오른쪽에서 위치에 따라 쉽게 결정될 수 있습니다:
- \(0001_2 = 1_{10}\)
- \(0010_2 = 2_{10}\)
- \(0100_2 = 4_{10}\)
- \(1000_2 = 8_{10}\)
그러므로:
\(1111_2\) | \(= 8_{10} + 4_{10} + 2_{10} + 1_{10}\) |
\(= 15_{10}\) |
약간의 연습과 함께, 한 단계에서 \(1111_2\)를 \(\rm F_{16}\)에 매핑하는 것이 쉬워집니다: 쓰기 표시(written representation)의 테이블을 참조하십시오. 십진수보다 십육진수를 사용하는 이점은 숫자의 크기에 따라 빠르게 증가합니다. 숫자가 커지면, 십진수로 변환하는 것이 매우 지루합니다. 어쨌든, 십육진수로 매핑할 때, 이진 문자열을 4-자릿수 그룹으로 고려하고 각각을 단일 십육진수로 매핑하는 것은 간단합니다.
이 예제는 이진수를 십진수로 변환하고, 각 자릿수를 십진수 값에 매핑하고, 결과를 더하는 것을 보여줍니다.
\((01011110101101010010)_2\) | \(= 262144_{10} + 65536_{10} + 32768_{10} + 16384_{10} + 8192_{10} + 2048_{10} + 512_{10} + 256_{10} + 64_{10} + 16_{10} + 2_{10}\) |
\(= 387922_{10}\) |
이것을 십육진수로의 변환과 비교해 보십시오. 여기서 4 자릿수의 각 그룹은 독립적으로 고려되고 직접 변환될 수 있습니다:
\((01011110101101010010)_2\) | = | 0101 | 1110 | 1011 | 0101 | \(0010_2\) |
= | 5 | E | B | 5 | \(2_{16}\) | |
= | \(\rm 5EB52_{16}\) |
십육진수에서 이진수로의 변환도 마찬가지로 직접적입니다.
Other simple conversions
비록 사진수 (밑수 4)는 거의 사용되지 않지만, 십육진수 또는 이진수로 쉽게 변환될 수 있습니다. 각 십육진수 자릿수는 한 쌍의 사진수 자릿수에 해당하고 각 사진수 자릿수는 한 쌍의 이진수 자릿수에 해당합니다. 위의 예제에서 \(\rm 5 E B 5 2_{16} = 11 32 23 11 02_4\)입니다.
팔진수 (밑수 8) 시스템도 상대적으로 쉽게 변환될 수 있지만, 밑수 2와 밑수 4만큼 간단하지는 않습니다. 각 팔진수 자릿수는 4개가 아닌 3개의 이진수 자릿수에 해당합니다. 그러므로, 이진수로의 중간 변환을 통해 팔진수와 십육진수 사이를 변환한 다음 이진수를 3개 또는 4개의 그룹으로 다시 그룹화할 수 있습니다.
Division-remainder in source base
모든 밑수와 마찬가지로, 원래 밑수에서 정수 나눗셈과 나머지 연산을 수행함으로써 숫자의 표현을 십육진수로 변환하는 간단한 알고리듬이 있습니다. 이론적으로, 이것은 임의의 밑수에서 가능하지만, 대부분의 인간에게는 십진수만, 대부분의 컴퓨터에서는 이진수 (훨씬 더 효율적인 방법으로 변환할 수 있음)만 이 방법으로 쉽게 처리될 수 있습니다.
d를 십육진수로 표현하는 숫자라고 놓고 \(\rm h_ih_{i−1}...h_2h_1\) 수열을 숫자를 나타내는 십육진수 자릿수라고 놓습니다.
- i ← 1
- \(\rm h_i\) ← d mod 16
- d ← (d − \(\rm h_i\)) / 16
- If d = 0 (return series \(\rm h_i\)) else increment i and go to step 2
"16"은 원하는 다른 밑수로 대체될 수 있습니다.
다음은 문자열 표현에서 임의의 숫자를 십육진수로 변환하기 위한 위 알고리듬의 자바스크립트(JavaScript) 구현입니다. 그 목적은 위의 알고리듬을 설명하는 것입니다. 어쨌든, 데이터를 진지하게 다루려면, 비트-별 연산자(bitwise operators)를 사용하는 것이 훨씬 더 좋습니다.
function toHex(d) {
var r = d % 16;
if (d - r == 0) {
return toChar(r);
}
return toHex((d - r) / 16) + toChar(r);
}
function toChar(n) {
const alpha = "0123456789ABCDEF";
return alpha.charAt(n);
}
Conversion through addition and multiplication
최종 표현을 얻기 위해 곱셈과 덧셈을 수행하기 전에 원래 밑수에서 각 자리에 자릿값의 십육진수 표현을 할당함으로써 변환하는 것도 가능합니다. 예를 들어, 숫자 B3AD를 십진수로 변환하려면, 십육진수를 그것의 자릿수: B (\(11_{10}\)), 3 (\(3_{10}\)), A (\(10_{10}\)), 및 D (\(13_{10}\))로 나누고, 그런-다음 각 십진수 표현에 \(16^p\)를 곱하여 최종 결과를 얻습니다 (p는 0부터 시작하여 오른쪽에서 왼쪽으로 세는 해당 십육진수 자릿수 위치입니다). 이 경우에서, 다음을 가집니다:
\(\rm B3AD = (11 \times 16^3)+(3\times 16^2) + (10\times 16^1)+(13\times 16^0)\)
이는 밑수 10에서 45997입니다.
Tools for conversion
많은 컴퓨터 시스템은 종종 십육진수를 포함하여 다양한 밑수 사이의 변환을 수행할 수 있는 계산기 유틸리티를 제공합니다.
Microsoft Windows에서, 계산기 유틸리티는 프로그래머에 의해 가장 공통적으로 사용되는 기수 16 (16진수), 10 (10진수), 8 (8진수), 및 2 (2진수) 사이의 변환을 허용하는 프로그래머 모드로 설정될 수 있습니다. 프로그래머 모드에서, 온-스크린 숫자-표시 키패드에는 "Hex"가 선택되었을 때 활성화되는 A부터 F까지의 16진수 숫자가 포함됩니다. 어쨌든, 16진수 모드에서, 윈도우 계산기는 정수만 지원합니다.
Elementary arithmetic
덧셈, 뺄셈, 곱셈, 및 나눗셈과 같은 기본 연산은 공통적으로-사용되는 십진 시스템 또는 각 십육진수 자릿수가 4개의 이진수 자릿수에 해당하는 이진법과 같은 대체 숫자-표시 시스템(numeral system)으로의 변환을 통해 간접적으로 수행될 수 있습니다.
대안적으로, 십육진수 시스템 자체 내에서 기본 연산을 직접 수행할 수도 있습니다. 덧셈/곱셈 테이블과 긴 나눗셈(long division) 및 전통적인 뺄셈 알고리듬과 같은 대응하는 표준 알고리듬에 의존합니다.
Real numbers
Rational numbers
다른 숫자-표시 시스템과 마찬가지로, 십육진수 시스템은 유리수를 나타내기 위해 사용될 수 있지만, 16 (\(10_{16}\))은 단일 소수 인수: 2만 가지기 때문에 반복 전개(repeating expansions)가 공통적입니다.
임의의 밑수에서, 0.1 (또는 "1/10")은 항상 자체 숫자 시스템에서 해당 밑수 값의 표현으로 1을 나눈 것과 같습니다. 따라서, 이진법에서 1을 2로 나누든 십육진법에서 1을 16으로 나누든 이들 두 분수는 모두 0.1로 씁니다. 기수 16은 완전 제곱 (\(4^2\)이기 때문에, 십육진수에서 표현된 분수는 십진수보다 훨씬 더 홀수 주기를 가지고, 순환 숫자(cyclic numbers) (자명한 한 자릿수 숫자 제외)가 없습니다. 반복되는 숫자는 가장 낮은 항에서 분모가 기수에서 찾을 수 없는 소수 인수(prime factor)를 가질 때 표시됩니다; 따라서, 십육진수 표기법을 사용할 때, 분모가 2의 거듭제곱이 아닌 모든 분수는 반복되는 자릿수의 무한한 문자열 (예를 들어 1/3과 1/5)이 됩니다. 이로 인해 십육진수 (및 이진수)는 유리수를 나타내는 데 십진수보다 덜 편리한데 왜냐하면 더 큰 비율이 유한 표현 범위 밖에 있기 때문입니다.
십육진수에서 유한하게 표현할 수 있는 모든 유리수는 역시 십진수, 십이진수, 및 육십진수로도 유한하게 표현할 수 있습니다: 즉, 자릿수가 유한한 십육진수는 그것들의 다른 밑수에서 표현될 때 유한 자릿수를 가집니다. 반대로, 후자의 밑수에서 유한하게 표현할 수 있는 것의 일부만이 십육진수로 유한하게 표현할 수 있습니다. 예를 들어, 십진수 0.1은 십육진수에서 무한 반복 표현 \(0.1\overline{9}\)에 해당합니다. 어쨌든, 십육진수는 분모에 2의 거듭제곱을 갖는 분수를 나타내는 데 십이진법 및 육십진법보다 더 효율적입니다. 예를 들어, \(0.0625_{10}\) (1/16)은 \(0.1_{16}\), \(0.09_{12}\), 및 \(0;3,45_{60}\)과 동등합니다.
Cultural history
전통적인 중국의 측정 단위는 밑수-16였습니다. 예를 들어, 오래된 시스템에서 1 jīn (斤)은 16 taels과 같습니다. 수안판(suanpan, 중국 주판)은 덧셈과 뺄셈과 같은 십육진수 계산을 수행하기 위해 사용될 수 있습니다.
십이진수(duodecimal) 시스템과 마찬가지로, 십육진수를 선호하는 숫자-표시 시스템으로 홍보하려는 시도가 가끔 있었습니다. 이들 시도는 종종 개별 숫자-표시에 대한 특정 발음과 기호를 제안합니다. 일부 제안은 표준 척도를 통합하여 16의 배수가 되도록 합니다. 그러한 초기 제안은 John W. Nystrom에 의해 1862년에 출판된 Project of a New System of Arithmetic, Weight, Measure and Coins: Proposed to be called the Tonal System, with Sixteen to the Base에서 제시되었습니다. Nystrom은 무엇보다도 하루를 16으로 나누는 16진수 시간을 제안하여, 하루가 16 "시간" (또는 "10 tims", tontim 발음됨)이 되도록 했습니다.
단어 hexadecimal은 1952년에 처음 기록되었습니다. 그것은 그리스어 ἕξ (hex) "six"와 라틴계 -decimal를 결합한 의미에서 마카로닉(macaronic)입니다. 모든-라틴 대안적인 sexadecimal (밑수 60진수에 대한 단어 sexagesimal와 비교)는 더 오래되었고, 적어도 19세기 후반부터 가끔 사용됩니다. 그것은 1950년대 Bendix 문서에서 여전히 사용되고 있습니다. Schwartzman (1994)은 sexadecimal이 sex에 대한 암시적인 약어 때문에 사용을 피했을 수 있다고 주장합니다. 1960년대 이후로 많은 서구 언어는 hexadecimal에 해당하는 용어를 채택해 왔지만 (예를 들어, 프랑스어 hexadécimal, 이탈리아어 esadecimale, 루마니아어 hexazecimal, 세르비아어 хексадецимални, 등), 다른 언어에서는 "sixteen"을 기본 단어로 대체하는 용어를 도입했습니다 (예를 들어, 그리스어 δεκαεξαδικός, 아이슬란드어 sextándakerfi, 러시아어 шестнадцатеричной, 등.)
용어와 표기법은 1960년대 말까지 정착되지 않았습니다. 1969년 Donald Knuth는 어원적으로 올바른 용어는 binary, ternary 및 quaternary 등을 모델로 한 "16으로 그룹화"를 전달하기 위한 라틴어 용어, senidenary 또는 sedenary일 것이라고 주장했습니다. Knuth의 주장에 따르면, decimal과 octal 산술에 대한 올바른 용어는 각각 denary와 octonary가 될 것입니다. Alfred B. Taylor는 1800년대 중반 대안적인 숫자 밑수에 대한 연구에서 senidenary를 사용했지만, 그는 "자릿수의 불편한 숫자" 때문에 밑수 16을 거부했습니다.
A에서 F까지의 문자를 사용하는 현재의 표기법은 IBM System/360에 대한 Fortran IV 매뉴얼이 출판된 후인 1966년부터 사실상의 표준으로 확립되었으며, 이는 (이전 Fortran 변형과 달리) 16진수 상수를 입력하기 위한 표준을 인식합니다. 위에서 언급한 바와 같이 NEC (1960) 및 The Pacific Data Systems 1020 (1964)에서는 대안적인 표기법을 사용했습니다. IBM이 채택한 표준은 1968년 Bruce Alan Martin이 CACM 편집자에게 보내는 편지에서 다음과 같이 불평하면서 널리 채택된 것으로 보입니다:
10진수 (또는 변수 이름)와 8진수 (또는 16진수)를 구별하는 이전의 문제에 더하여 16진수 기호로 문자 A, B, C, D, E, F를 우스꽝스럽게 선택하면, 우리의 숫자 기호를 재고할 시간이 너무 많이 듭니다. 이것은 잘못된 선택이 사실상의 표준이 되기 전에 이루어져야 했습니다!
Martin의 주장은 비-십진수 숫자에서 0에서 9까지의 숫자-표시를 사용하는 것은 "우리에게 밑수-10 위치-값 체계를 암시한다"는 것입니다: "8진수 또는 16진수에 필요한 7 또는 15 비-영 자릿수에 대해 완전히 새로운 기호 (및 이름)를 사용하지 않는 이유는 무엇입니까? A에서 P까지의 문자를 사용하는 것만으로도 개선될 수 있지만, 완전히 새로운 기호는 시스템의 이진 본성을 반영할 수 있습니다." 그는 역시 "수치적 자릿수에 알파벳 문자를 재사용하는 것은 16세기 전에 숫자에 대한 고유한 비-알파벳 글리프의 발명에서 거대한 후퇴를 나타냅니다" (브라흐미 숫자-표시로, 및 나중에 힌두-아라비아 숫자-표시 시스템에서), 그리고 최근의 ASCII 표준 (ASA X3.4-1963 및 USAS X3.4-1968)은 "구두점 문자로 불필요하게 채우지 않고 열 개의 십진 자릿수 다음에 6개의 코드 테이블 위치를 보존해야 했습니다" (":;< =>?")는 128개의 사용 가능한 위치 중 다른 위치에 배치되었을 수 있습니다.
Base16 (transfer encoding)
Base16 (공백 없이 적절한 이름으로)은 Base32, Base58, 및 Base64와 같은 가족에 속하는 텍스트 인코딩에 대한 바이너리를 참조할 수도 있습니다.
이 경우에서, 데이터는 4비트 순서열로 나뉘고, 각 값 (0에서 15 사이)은 ASCII 문자 집합에서 16개 기호 중 하나를 사용하여 인코딩됩니다. 비록 ASCII 문자 집합에서 임의의 16개 기호가 사용될 수 있지만, 실제로는 ASCII 자릿수 '0'–'9' 및 문자 'A'–'F' (또는 소문자 'a'–'f')가 16진수에 대한 표준 표기법에 맞추기 위해 항상 선택됩니다.
Base16 인코딩에는 몇 가지 장점이 있습니다:
- 대부분의 프로그래밍 언어에는 이미 ASCII-인코딩된 16진수를 구문 분석할 수 있는 기능이 있습니다.
- 정확히 0.5바이트인, 4비트는 각각 Base32 및 Base64의 5비트 또는 6비트보다 처리하기 쉽습니다.
- 기호 0–9와 A–F는 16진수 표기법에서 보편적이므로, 기호 조회 테이블에 의존하지 않고도 한눈에 쉽게 이해할 수 있습니다.
- 많은 CPU 아키텍처에는 절반-바이트 ("니블"이라고도 함)에 대한 접근을 허용하는 전용 명령어를 가지며, Base32 및 Base64보다 하드웨어에서 더 효율적입니다.
Base16 인코딩의 주요 단점은 다음과 같습니다:
- 원본 데이터에서 각 4비트 값이 8-비트 바이트로 인코딩되기 때문에 공간 효율성은 50%에 불과합니다. 반대로, Base32 및 Base64 인코딩의 공간 효율성은 각각 63% 및 75%입니다.
- 대문자와 소문자를 모두 허용해야 하는 추가 복잡성의 가능성이 있습니다.
Base16 인코딩 지원은 최신 컴퓨팅에서 보편적입니다. 그것은 URL 퍼센트 인코딩을 위한 W3C 표준의 기초이며, 여기서 문자는 퍼센트 기호 "%" 및 Base16-인코딩 형식으로 대체됩니다. 대부분의 최신 프로그래밍 언어에는 Base16으로 인코딩된 숫자의 형식 지정 및 구문 분석에 대한 지원이 직접 포함됩니다.