16진수
컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많다.
16진수는 컴퓨터에서 데이터를 처리할 때 여러 가지 장점을 제공한다.
16진수와 10진수의 차이를 이해하면 16진수가 2진수를 간단하게 나타낼 수 있다는 것을 알 수 있다.
이제 16진수, 2진수, 10진수 간의 변환을 이해하고 프로그램을 작성해보자.
10진수를 16진수로 변환
JPG 이미지 파일은 항상 10진수 255, 216, 255로 시작한다.
그러나 실제로 컴퓨터 내에서는 10진수를 사용하지 않는다. 컴퓨터는 0과 1만을 이해하기 때문이다.
예를 들어 255, 216, 255를 2진수로 나타내면 다음과 같다:
255: 11111111
216: 11011000
255: 11111111
2진수로 모든 데이터를 표현하기에는 너무 길어지기 때문에 16진수로 변환하면 더 간단해진다.
$2^4$는 16이므로 4비트씩 묶어 16진수로 변환할 수 있다.
예를 들어 1111은 16진수로 F가 된다. 10부터 15까지는 각각 a, b, c, d, e, f로 표기한다.
16진수로 변환한 후에는 앞에 0x
를 붙여 16진수임을 나타낸다.
16진수의 유용성
ASCII 코드에 의해 “A, B, C”는 10진수로 65, 66, 67에 해당한다.
컴퓨터는 10진수를 이해하지 못하므로 2진수로 표현한다.
A: 01000001
B: 01000010
C: 01000011
이처럼 길이가 길지만 16진수로 표현하면 훨씬 간단해진다.
또한, 컴퓨터는 8개의 비트가 모인 바이트 단위로 정보를 표현한다.
2개의 16진수는 1바이트의 2진수로 변환되기 때문에 정보를 표현하기 매우 유용하다.
메모리 주소
정수형 변수 n
에 50이라는 값을 저장하고 출력한다고 가정해보자.
이 n
이라는 값은 int
타입이므로, 컴퓨터의 메모리 어딘가에 4바이트 만큼의 자리를 차지하며 저장된다.
C에서는 변수의 메모리 주소를 얻기 위해 &
연산자를 사용할 수 있다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%p\n", &n);
}
위 코드를 실행하면 0x7ffe00b3adbc
와 같은 값을 얻을 수 있는데, 이는 변수 n
의 16진법으로 표현된 메모리 주소이다.
반대로 *
연산자를 사용하면 그 메모리 주소에 있는 실제 값을 얻을 수 있다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%i\\n", *&n);
}
먼저 n
의 주소를 얻고 다시 그 주소에 해당하는 값을 얻어와 출력하므로 결국 50
이라는 값이 출력된다.
간단하게 아래 코드처럼 프로그램을 작성할 수 있다.
#include <stdio.h>
// 10진수를 16진수로 변환하여 출력
void decimalToHex(int decimal)
{
printf("Decimal %d in Hexadecimal: %X\n", decimal, decimal);
}
// 10진수를 2진수로 변환하여 출력
void decimalToBinary(int decimal)
{
printf("Decimal %d in Binary: ", decimal);
for (int i = 31; i >= 0; i--)
{
int binary = (decimal >> i) & 1;
printf("%d", binary);
}
printf("\n");
}
int main(void)
{
int decimal = 255;
decimalToHex(decimal);
decimalToBinary(decimal);
return 0;
}
References
'CSE > CS 기초' 카테고리의 다른 글
[CS50] 메모리 - 문자열 (0) | 2024.06.17 |
---|---|
[CS50] 메모리 - 포인터 (0) | 2024.06.14 |
[CS50] 알고리즘 - 재귀 (0) | 2024.06.14 |
[CS50] 알고리즘 - 버블 정렬 (1) | 2024.06.14 |
[CS50] 알고리즘 - 알고리즘 표기법 (1) | 2024.06.13 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!