제목마법 상자 속 숫자들의 비밀: 우리 컴퓨터는 어떻게 숫자를 기억할까요?2025-05-10 14:36

마법 상자 속 숫자들의 비밀: 우리 컴퓨터는 어떻게 숫자를 기억할까요?

여러분, 안녕하세요! 오늘은 우리가 매일 사용하는 컴퓨터나 스마트폰이 어떻게 숫자를 척척 기억하고 계산해 내는지, 그 신비로운 세계로 함께 떠나볼까 합니다. 마치 마법 상자처럼 보이지만, 그 속에는 아주 체계적이고 논리적인 규칙들이 숨어있답니다. 특히 C언어라는 프로그래밍 언어의 눈으로 보면 이 비밀이 더욱 명확하게 보이죠.


작은 점 하나에도 의미가! 소수점은 어떻게 저장될까요?

우리가 "오늘 온도가 32.7도야"라고 말할 때, 컴퓨터는 이 '32.7'이라는 숫자를 어떻게 기억할까요? 그냥 종이에 적듯이 그대로 저장할까요? 사실 컴퓨터는 우리가 쓰는 십진법이 아닌, 0과 1로만 이루어진 이진법의 세계에 살고 있답니다. 그래서 32.7 같은 소수(정확히는 실수)를 저장할 때는 조금 특별한 방법을 사용해요.

컴퓨터는 소수를 저장할 때 '가수', '밑', '지수'라는 세 가지 요소로 나누어 기억합니다. 이게 무슨 말이냐고요?

  • 가수(Mantissa): 실제 숫자의 유효한 부분을 나타냅니다. 32.7에서는 '327' 같은 부분이 되겠죠.
  • 밑(Base): 보통은 2입니다. 컴퓨터는 이진법을 사용하니까요.
  • 지수(Exponent): 소수점의 위치를 알려주는 역할을 합니다. "3.27 곱하기 10의 1제곱"처럼 말이죠.

이렇게 나누면 아주 큰 숫자나 아주 작은 소수도 효율적으로 표현할 수 있어요. 그리고 컴퓨터는 이런 소수를 저장하기 위해 특별한 공간을 마련해두는데, 보통 float라는 이름표가 붙은 방(4바이트 크기)과 double이라는 이름표가 붙은 더 넓은 방(8바이트 크기)을 사용합니다. double 방이 더 크니 당연히 더 정밀하게 숫자를 기억할 수 있겠죠?


십진수를 이진수로! 변환 대작전

자, 그럼 32.7이라는 숫자가 실제로 컴퓨터 마법 상자 속에 들어가는 과정을 따라가 볼까요?부터 이 흥미진진한 변환 과정이 시작됩니다.


  1. 정수 부분과 소수 부분 분리: 먼저 32.7을 정수 부분인 '32'와 소수 부분인 '0.7'로 나눕니다.
  2. 각각 이진수로 변환:
    • '32'를 이진수로 바꾸면 '100000'이 됩니다. (2의 5제곱이니까요!)
    • '0.7'을 이진수로 바꾸는 건 조금 더 복잡한데, 0.7에 계속 2를 곱하면서 정수 부분만 취하는 과정을 반복합니다. 예를 들어, 0.7 x 2 = 1.4 (정수 1), 0.4 x 2 = 0.8 (정수 0), 0.8 x 2 = 1.6 (정수 1)... 이런 식으로 '0.1011...' 같은 이진 소수가 만들어집니다.
  3. 하나로 합치기: 이렇게 변환된 두 이진수를 합치면 '100000.1011...'와 같은 형태가 됩니다.

숫자들의 기준! 정규화 과정

그런데 컴퓨터는 여기서 한 단계 더 나아갑니다. 바로 '정규화'라는 과정인데요, 숫자를 일정한 형식으로 맞추는 작업이라고 생각하시면 됩니다. 보통 이진수에서는 가장 왼쪽에 있는 '1' 바로 뒤에 소수점이 오도록 조정해요.

예를 들어 '100000.1011...'은 '1.000001011...'로 바꾸고, 대신 "여기에 2를 5번 곱해야 원래 숫자가 돼!"라는 정보를 지수 부분에 저장하는 거죠. 이렇게 하면 숫자를 표현하는 방식이 통일되어서 다루기가 훨씬 편해집니다.
 

32칸 방에 차곡차곡, 부동소수점 저장의 비밀

이제 이 모든 정보, 즉 부호(플러스인지 마이너스인지), 정규화된 가수, 그리고 조정된 지수를 float이라는 32칸짜리 방(32비트)에 차곡차곡 넣어야 합니다.

  • 부호 비트 (1칸): 숫자가 양수면 0, 음수면 1을 저장합니다.
  • 지수 비트 (8칸): 조정된 지수 값을 저장하는데, 여기서 재미있는 점은 지수가 음수가 될 수도 있어서 실제 지수 값에 '127'이라는 바이어스(bias) 값을 더해서 저장한다는 거예요. 이렇게 하면 음수 지수도 양수로 표현해서 처리하기가 쉬워집니다.
  • 가수 비트 (23칸): 정규화된 가수의 소수점 아랫부분을 저장합니다. (정규화하면 맨 앞은 항상 '1'이니까 굳이 저장할 필요가 없거든요!)

마치 정해진 규격의 상자에 물건을 종류별로 칸을 나눠 담는 것과 비슷하죠?
 

숫자 꾸러미, 배열을 만나다!

지금까지 숫자 하나가 저장되는 과정을 살펴봤는데요, 만약 우리가 "우리 반 학생 30명의 수학 점수"처럼 여러 개의 숫자를 한꺼번에 다루고 싶을 때는 어떻게 할까요? 이때 등장하는 것이 바로 '배열(Array)'입니다.

배열은 마치 "똑같은 크기의 방이 여러 개 줄지어 붙어있는 아파트"와 같아요. 이 아파트의 각 방에는 같은 종류의 데이터(예: 모든 방에 수학 점수만)를 저장할 수 있습니다. 그리고 각 방에는 '0호실, 1호실, 2호실...'처럼 번호표(인덱스)가 붙어 있어서 원하는 방의 숫자를 쉽게 찾아 꺼내 쓸 수 있답니다. "3반 15번 학생 점수 가져와!"처럼 말이죠.
 

메모리 속 배열의 모습

컴퓨터 메모리라는 넓은 공간에 이 배열 아파트가 실제로 어떻게 지어지는지 상상해 볼까요? 예를 들어 정수(integer) 여러 개를 담는 배열을 만들면, 각 정수가 차지하는 만큼의 메모리 공간(보통 4바이트)이 연속적으로 착착착 할당됩니다. 첫 번째 학생의 점수가 100번지에 저장되었다면, 두 번째 학생의 점수는 바로 옆인 104번지에 저장되는 식이죠. 빈틈없이 따닥따닥 붙어서요!
 

이 모든 것이 '포인터'를 위한 준비운동!

이렇게 숫자들이 메모리에 저장되는 방식, 특히 배열이 연속된 공간에 자리를 잡는 모습을 이해하는 것은 프로그래밍에서 매우 중요한 '포인터(Pointer)'라는 개념을 이해하기 위한 훌륭한 준비운동이 됩니다. 포인터는 바로 이 메모리 주소 자체를 다루는 강력한 도구거든요! 마치 "몇 동 몇 호에 누가 사는지" 직접 주소를 가지고 정보를 찾아가는 것과 비슷합니다.

어떠셨나요? 조금은 복잡하게 느껴질 수도 있지만, 컴퓨터가 숫자를 기억하는 방식이 생각보다 체계적이고 논리적이라는 것을 느끼셨을 거예요. 우리가 무심코 사용하는 편리한 디지털 세상 뒤에는 이처럼 수많은 약속과 규칙들이 숨어 있답니다. 다음에는 또 다른 컴퓨터 속 비밀을 함께 파헤쳐 보기로 해요!


유튜브 채널에서 더 자세한 내용 확인해보세요! 
https://youtu.be/ue9apvTHstk