티스토리 뷰

16진수

16진수는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 로 숫자를 나타낸다. 0에서 9까지는 10진수와 값이 동일하고, A는 10, B는 11, C는 12, D는 13, E는 14, F는 15를 나타낸다. 즉 16진수에서는 한자리 수로 0에서부터 15까지 표현할 수 있다.

그런데 위에서 보다시피, 0에서부터 9까지는 10진수와 동일한 값이라서 10진수와 헷갈릴 우려가 있다. 그래서 16진수에서는 모든 수 앞에 0x 를 붙인다. 이건 아무런 의미가 없고 그냥 16진수라는 뜻으로 붙인다. 예를 들어 16진수의 0은 0x0 으로 표기한다.

그렇다면 이해를 돕기 위해 2진수를 16진수로 바꾸어보자.

8비트가 나타낼 수 있는 가장 큰 수는 255이다. 2진수로는 11111111이다. 이걸 4비트씩 끊어서 보자. 4비트는 0에서부터 최대 15까지 나타낼 수 있다. 즉, 16진수가 나타낼 수 있는 한 자리수와 동일하다. 즉 11111111을 앞 부분의 1111과 뒷 부분의 1111로 나누어서 각각 십진수 값 15에 해당하는 F를 주면 FF가 된다. 그리고 마지막으로 0x를 붙여 16진수임을 표기하면 0xFF가 된다.

메모리 주소

C언어에서는 메모리 주소를 출력할 수 있다. 이 메모리 주소는 16진수로 나타내어진다.

예를 들어 int n = 50; 으로 초기화했을 때, 이 변수 n은 컴퓨터 메모리의 어딘가에 저장되었을 것이다. 그런데 이 주소를 알고 싶으면 아래처럼 주소를 가져오라는 앰퍼샌드(&)를 붙여서 출력하면 된다. 형식지정자는 pointer의 약자인 p를 쓴다.

#include<stdion.h>

int main(void)
{
  int n = 50;
  printf("%p\n", &n); // &는 변수 n의 주소를 가리킨다는 뜻이다. 
}

실제로 출력해보면 0x로 시작하는 긴 16진수가 출력된다. 실제로 n이라는 변수가 메모리의 해당 주소에 있다는 것이다. 메모리의 주소는 포인터 라고 한다. 위 코드는 변수 n의 포인터 값을 출력하는 코드이다.

반대로 주소를 이용해서 값을 출력할 수도 있다.

#include<stdion.h>

int main(void)
{
  int n = 50;
  printf("%i\n", *&n); // *는 해당 주소로 가서 값을 가져오라는 뜻이다. 
}

앰퍼샌드(&)로 n의 주소를 알아낸 다음, 다시 반대로 애스터리스크(*)로 해당 주소로 가서 값을 가져오게 한다. 이렇게 하면 변수 n에 저장된 값인 50이 출력된다. (요약: &는 What is the address? 이고 *는 Go to the address이다.)

#include <stdio.h>

int main(void)
{
  int n = 50;
  int *p = &n;
  printf("%p\n", p);
  printf("%i\n", *p); // 50을 출력한다. *&n을 출력하는 것과 동일하다.
}

여기서 int *p 는 새로운 자료형의 변수다. int *이 변수는 포인터를 값으로 가지며, 포인터가 가리키는 값은 int라는 뜻이다 . 즉 변수 p는 포인터 값을 저장하는 포인터 변수이다.

위 코드에서는 변수 n의 메모리 주소를 저장하였다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함