본문 바로가기
c언어

c언어 컴퓨터에서 정수를 표현하는 방법 알아보기(2진수, 8진수, 10진수, 16진수)

by 개발자 L 2022. 11. 27.
반응형

c언어 컴퓨터에서 정수를 표현하는 방법 알아보기(2진수, 8진수, 10진수, 16진수)

네 안녕하세요, 이번 포스팅에서는 컴퓨터에서 정수를 표현하는 방법에 대하여 한 번 적어보려 합니다.

일단 컴퓨터는 현실 세계에 사는 우리들과 다르게 디지털 환경에서 작업을 수행합니다.

그래서 표현 방식이 우리들이 쓰는 방식과는 조금 다릅니다.

그래서 이번 포스팅에서는 컴퓨터는 어떤 식으로 수를 표현을 하는지, 그리고 어떻게 연산을 진행을 하는지 한 번 같이 알아보도록 하겠습니다.

그럼 지금부터 같이 볼까요?

 

1. 컴퓨터에서의 정수 표현 방식

우선 컴퓨터는 우리들이 쓰는 아날로그식 표현과는 다른 디지털 펄스로 표현을 합니다.

그래서 연속적인 아날로그와는 달리 뚝뚝 끊깁니다.

그 이유는 디지털 표현 방식은 2진수 표현, 다시 말해 0과 1로만 표현을 합니다.

마치 스위치가 켜졌다 꺼졌다 하는 것과 말이죠.

그래서 1이면 2의 승수가 추가가 되고, 0이라면 0으로 둡니다.

예를 들어서 2진수 중에 11이라는 수가 있다면 이는 2^0 + 2^1이 되어서 1 + 2 = 3이 됩니다.

이런 식으로 컴퓨터가 인식을 합니다.

그리고 2진수에서의 1과 0으로 참과 거짓 여부도 따질 수 있습니다.

컴퓨팅 언어에서 1은 참(True)을 의미하고, 0은 거짓(False)을 의미하기 때문입니다.

그리고 이는 나중에 배울 문법 중에서 무한루프를 돌려야 하는 경우에도 활용을 합니다.

 

2. 컴퓨터에서의 양수와 음수 표현 방식

컴퓨터에서도 양수와 음수를 표현하는 방법이 각각 다릅니다.

그냥 양수인 경우에는 단순히 10진수를 2진수로 바꾸어서 표현을 하지만,

음수의 경우에는 그냥 변환만 해서는 표현이 불가능합니다.

그래서 컴퓨터는 양수와 음수를 처리할 때 최상위 비트, 다시 말하면 2진법으로 나열된 숫자열 중에서 2의 승수가 가장 큰 자리의 수를 0 또는 1로 두어서 부호를 정합니다.

양수의 경우는 그냥 0으로 두지만, 음수의 경우는 1로 표현을 합니다.

반응형

 

3. 컴퓨터에서의 연산

하지만 이렇게 표현을 하고 나서도 문제가 하나 있는데, 그건 바로 연산입니다.

예를 들어서 3과 -3을 더하는 연산을 해본다고 가정을 해봅시다.

그러면 3 + (-3)이 되어서 3 - 3이 되죠?

현실 세계에서는 이게 가능하지만 ,컴퓨터는 이걸 인지하지 못합니다.

그 이유는 컴퓨터는 연산장치의 복잡도를 줄이기 위해서 덧셈 회로만을 구성을 해뒀고,

컴퓨터에서는 위의 언급한 방식의 연산을 허용하지 않기 때문입니다.

그래서 실제 연산을 하면 엉뚱한 값이 나와버립니다.

그래서 우리가 덧셈이나 뺄셈을 할 때 부호에 신경을 쓰지 않고서 무조건 순수 2진수 덧셈과 뺄셈만 할 수 없다고 생각하지만,

방법은 하나 존재합니다.

바로 2의 보수를 이용하는 방법입니다.

 

4. 2의 보수

일단 보수가 무엇인지 알아야 하는데요,

보수는 어떤 일정한 수가 되게 만드는 수 입니다.

10진수 체계에서는 합이 무조건 10이 되게 하는 수이고,

컴퓨터에서의 2진수 체계에서는 무조건 각 자리의 연산 결과가 1이 나오도록 하는 수입니다.

그래서 서로 보완을 해줘서 최댓값을 뽑아내는 수라고 생각하시면 됩니다.

그리고 컴퓨터에서는 2진수 연산을 하기 때문에 2위 보수를 만듭니다.

2의 보수는 보통 음수로 취급이 되는데, 그 이유는 2의 보수의 가장 높은 자리의 수가 1이기 때문입니다.

다시 말하면 양수로 취급이 되는 2진수를 반전시켜서 얻는다는 의미이기도 하지요.

그래서 2의 보수를 구하는 방법은 이렇습니다.

  • 모든 비트의 숫자를 반전시킨다.
  • 제일 하단의 비트에 1을 더한다.

이 과정대로 합니다.

그렇지만 앞서 말씀드린 대로 2의 보수는 음수로 취급하기 때문에 최상단 비트의 숫자는 무조건 1이어야 합니다.

예를 들어서 01111111을 2의 보수로 만든다고 하면, 10000001로 된다는 이야기입니다.

그리고 보통 연산은 8비트 연산과 32비트 이상의 연산을 많이 사용합니다.

그 이유는 네트워크 관리를 할 때 ip주소 설정을 할 때도 많이 쓰기 때문에 범용성 측면에서 매우 높습니다.

그리고 c언어의 경우는 2진수로 반환하여 출력해주는 기능이 존재하지는 않습니다.

그래서 그러한 기능을 가진 소스를 만들어야 하는데, 그걸 만들기 위해서는 반복문이라는 문법을 배워야 하기 때문에 제가 나중에 한 번 다뤄보도록 하겠습니다.

하지만, c언어에서는 출력을 할 때 16진수로 출력을 할 수 있도록 해주는 기능은 있습니다.

그럼 간단한 예제 코드를 통하여 한 번 살펴볼까요?

#include <stdio.h>

int main()
  
{
  int x = 3;
  int y = -3;

  printf("x = %08x\n", x);
  printf("y = %08x\n", y);
  printf("x + y = %08x\n", x + y);

  return 0;
}

이런 식으로 표현이 가능합니다.

여기에서 %x 사이에 숫자를 집어넣게 되면 출력하는 필드의 비트 수를 해당 숫자만큼 제한을 하겠다는 뜻이 됩니다.

그래서 여기에서는 %08x를 썼으니, 출력 필드 크기를 8비트로 제한을 하겠다는 뜻이 됩니다.

그리고 형식 지정자에 쓰는 x는 대소문자를 굳이 구별할 필요는 없습니다.

다만, 대문자로 쓰면 16진수에서 알파벳으로 표현하는 숫자는 대문자로 나오고, 소문자로 표현하면 알파벳으로 표현되는 수는 소문자로 출력이 됩니다.

그럼 결과 화면을 함께 보실까요?

%08X로 출력했을 경우 :

x = 00000003
y = FFFFFFFD
x + y = 00000000
%08x로 출력했을 경우

x = 00000003
y = fffffffd
x + y = 00000000

이렇게 출력이 되는 것을 확인하실 수 있습니다.

 

여기까지 컴퓨터에서의 정수 표현 방식에 대하여 한 번 알아봤습니다.

다음 포스팅에서는 부동 소수점형에 대하여 알아보는 시간을 한 번 가져보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사합니다 ~

반응형

댓글