16진수 → 10진수: 16진수 값에 의미 붙이기
이 변환이 하는 일
기수 16 값을 읽어 기수 10으로 다시 씁니다. 16진수는 기계와 비트 패턴을 비교하는 사람에게 편하지만 임계값이나 바이트 크기처럼 사람이 한눈에 판단해야 하는 값에는 10진수가 필요합니다. 도구가 값을 건네주고 설명을 멈출 때 찾게 되는 방향이 이쪽입니다.
자리 가중치는 16의 거듭제곱
오른쪽부터 각 16진수 자리에 1, 16, 256, 4096… 을 곱합니다. 1E90FF는 1 곱하기 16의 다섯제곱에 14 곱하기 16의 네제곱을 더하는 식으로 계산해 2003199이 됩니다. 모든 기수에서 같은 가중합이고 가중치만 바뀌므로 2진수와 8진수에도 같은 방법이 통합니다.
16진수 → 10진수 변환표
디버깅과 웹 작업에서 늘 보이는 16진수 값과 그 10진수 대응입니다. 기억할 값은 딱 떨어지는 16진수들이며 이들이 바이트와 페이지 경계를 표시합니다.
| 16진수 | 10진수 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| F | 15 |
| 10 | 16 |
| 7F | 127 |
| A5 | 165 |
| FF | 255 |
| 1000 | 4096 |
| FFFF | 65535 |
| DEADBEEF | 3735928559 |
사람들이 실제로 해독하는 것들
되풀이되는 작업은 색상 채널 읽기, 메모리 주소를 경계와 견주기, 잘린 해시를 비교 가능한 값으로 만들기 세 가지입니다. 색상이 가장 친절한 예로, 0x1E90FF는 30과 144와 255로 나뉘어 파랑 채널이 포화이고 빨강이 약하다는 것을 알려줍니다. 같은 세 단계 읽기가 어떤 압축 값에도 적용됩니다.
변환하기 전에 값을 쪼개기
여섯 자리 색상이나 긴 주소는 두 자리씩 묶으면 읽기 쉽습니다. 두 자리가 한 바이트이기 때문입니다. 값을 통째로 변환하는 것도 답 하나로는 충분하지만, 먼저 쪼개야 어느 바이트가 이상한지 보이고 그게 보통 진짜 질문입니다.
자주 묻는 질문
16진수를 10진수로 손으로 계산하려면 어떻게 하나요?
오른쪽부터 각 자리에 1, 16, 256, 4096… 의 자리값을 곱해 모두 더합니다. A는 10, B는 11이고 F가 15라는 것만 기억하면 됩니다. 1E90FF는 1048576 + 917504 + 36864 + 0 + 240 + 15로 2003199입니다.
메모리 주소는 왜 긴 16진수처럼 보이나요?
주소가 바이트와 워드 경계에 자연스럽게 정렬되고, 16진수 자릿수는 그 경계와 나란히 맞기 때문입니다. 16진수 두 자리가 1바이트이므로 주소의 앞자리는 페이지를, 뒷자리는 페이지 안에서의 위치를 나타냅니다.
0x 접두사가 붙은 값을 그대로 붙여 넣어도 되나요?
됩니다. 접두사는 인식해서 변환 전에 제거하므로 디버거나 소스 파일에서 그대로 복사한 값도 손대지 않고 쓸 수 있습니다. 현재 페이지와 맞지 않는 접두사는 조용히 무시되지 않고 알려 주어 잘못 읽은 값이 새어 나가지 않습니다.
16진수 값은 얼마나 클 수 있나요?
64비트는 물론 그 이상도 됩니다. 그 범위의 위쪽 값은 일반 부동소수점이 정확히 담지 못하므로, 이 변환은 정수 연산으로 동작해 스프레드시트가 내놓는 반올림된 답 대신 모든 자리를 정확히 돌려줍니다.
해시 앞부분도 숫자로 의미가 있나요?
산술적으로는 그렇고 실용적으로는 아닙니다. 해시의 앞 몇 바이트를 10진수로 바꾸면 패턴을 찾거나 비교 스크립트를 짜는 데 쓸모가 있습니다. 다만 잘린 해시는 해시였던 성질을 이미 잃었으므로 그 10진수를 식별자로 삼아서는 안 됩니다.