본문 바로가기
cs/CS50

5: 메모리-1(메모리 주소)

by 이쟝 2021. 12. 2.

16진수

컴퓨터에서는 데이터를 처리하기 위해 10진수나 2진수 대신 16진수로 표현함(16진수의 장점 때문)


2진법 , 10진법, 16진법

2진법: 0과 1

- 0 bit가 8개 있고 각 bit는 한 이진수를 의미함

- 00000000 (2^7=128부터 2^0=1)

- 255는 8비트로 셀 수 있는 가장 큰 값(0부터 세기 때문에 한 개 빼줘야 함: 128+64+32+16+8+4+2+1=255)

10진법: 0부터 9

- 각 자릿수가 10인 거듭제곱을 의미함 예) 1(10^0), 10(10^1), 100(10^2)...

16진법: 0부터 F(15)

- 10부터 15까지는 알파벳으로 표기(A=10, B=11, C=12, D=13, E=14, F=15)

- 16진법에서 1 0을 그냥 십으로 읽으면 안 되고 떨어뜨려서 "일영" 이렇게 읽어줘야 함

- 10진수와 헷갈리는 것을 방지하기 위해서 16진수를 사용할 때는 모든 16진 수 앞에 0x를 붙이기로 함

- 0x는 수학적으로 아무런 의미가 없지만 앞으로 나오는 값이 16진수라고 알려주는 역할을 함

 


10진수를 16진수로 바꾸기

JPG 이미지 파일은 항상 255 216 255로 시작되고 이것은 10진수지만 컴퓨터는 0과 1만 이해할 수 있기 때문에 실제 컴퓨터 내에서는 10진수를 사용하지 않음

컴퓨터는 0과 1만 이해할 수 있어서 10진수를 2진수로 변환하지만 모든 데이터를 표현하기에는 너무 길어져서 16진수로 바뀌게 됨

(2^4 = 16)이기 때문에 4 bits 씩 두 덩어리로 나누어보면 0000부터 1111까지는 16진수로 표현할 수 있음


16진수의 유용성

ASCII 코드에 의해 "A, B, C"는 10진수로 65, 66, 67에 해당함

이것을 2진수로 표현해보면 "01000001, 01000010, 01000011”

이것을 16진수로 표현하면 훨씬 간단해짐

또한 컴퓨터는 8개의 비트가 모인 바이트 단위로 정보를 표현하기 때문에 2개의 16진수는 1byte의 2진수로 변환되기 때문에 정보를 표현하기에도 매우 유용함


메모리 주소

 

정수형 변수 n에 50이라는 값을 저장하고 출력하는 코드 작성

 

#include <stdio.h>

int main(void)
{
    int n = 50;
      printf("%i\n",n);
}

 

이 n의 값은 int 타입이기 때문에 우리 컴퓨터의 메모리 안에 4바이트만큼의 자리를 차지해서 저장되어 있을 것

 

메모리안에 저장된 변수 n

C에서는 변수의 메모리상 주소를 바기 위해 "&" 연산자를 사용할 수 있음

&은 "~의 주소"를 의미하는 연산자로 &n이라고 적으면 n이 있는 주소를 알려줌(메모리 속의 위치)

이를 위한 또 다른 형식 지정자인 %p가 있음(%i 대신에 %p를 사용)

우리가 컴퓨터에 특정 값의 주소를 요구한 것으로 그 값을 가리키는 포인터의 값을 돌려받음

 

#include <stdio.h>

int main(void)
{
    int n = 50;
      printf("%p\n",&n);
}

 

결과(n의 주소)

결과는 변수 n의 16진법으로 표현된 메모리의 주소

*를 사용하면 그 메모리 주소에 있는 실제 값을 얻을 수 있음

*은 "~의 주소와 반대의 동작을 함" &의 의미가 주소가 무엇인지를 물어보는 것이라면 *은 그 주소로 가라는 의미

주소가 아니라 n의 값을 출력하려고 한다면 *를 사용 

 

#include <stdio.h>

int main(void)
{
    int n = 50;
      printf("%i\n",*&n);
}

 

위 코드는 먼저 n의 주소를 얻고, 또 그 주소에 해당하는 값을 출력한 것이므로 결과는 50

 

https://www.boostcourse.org/cs112/joinLectures/41307

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org