8 min read

cpp[7] - 아스키 코드

C++에서 char 자료형과 string 자료형으로 영어 문자를 표현할 수 있다는 것을 알아보았습니다. 이 "문자의 표현" 에 대해서 조금 더 깊게 짚고 넘어가보도록 하겠습니다.

변수의 크기

cpp[2] - 입력받기 및 사칙연산
숫자, 문자, 특수문자, 문자열 등을 자유자재로 출력할 수 있게 되었기에, 이들을 입력받아서 활용하는 방법에 대해서 다루도록 하겠습니다. 변수 변수 (Variable)는 수학에서의 x,y,z 와 같은 존재이지만, C++ 언어에서는 박스와 같은 개념으로 이해하는것이 가장 간단합니다. 값이 변할 수 있다는 점은 수학과 동일하지만, 수학과는 다르게 어떤 수식에 의해 종속되어서 y=

글에서, 변수가 마치 박스와도 같다는 비유를 했습니다.
이 비유가 자주 사용되는 주된 이유는, 참으로 절묘하게도 박스에 비교했을때 변수의 많은 특징을 설명 가능하기 때문입니다.

우선 bit 라고 하는 단위부터 보도록 하겠습니다.

bit(binary digit)

비트 라는것은 이진수에서의 기본 단위입니다.
켜져있거나(1), 꺼져있는(0) 두개의 상태만을 가질 수 있습니다.
전기가 흐르거나(1), 흐르지 않거나(0) 두개의 상태로 구분지어줄 수 있기 때문에 컴퓨터의 기본 단위는 비트로 통일되어 있습니다.

컴퓨터에서 숫자를 표현할때도 비트를 사용해서 표현하는데,
2진수 1011 를 예를 들어 표현해 보자면,
10진수 1234가 1x1000 + 2x100 + 3x10 + 4x1 로 분리해 표현할 수 있듯이
1x8 + 0x4 + 1x2 + 1x1 으로 표현할 수 있으며, 10진수로는 11이 됩니다.

이러한 비트 8개가 모여있는 단위를 바이트byte 라고 부르며, 자료형마다 박스의 크기에 비유되고는 하는 크기가 있습니다.

  • int 4바이트, 32비트
  • long long 8바이트, 64비트
  • float 4바이트, 32비트
  • double 8바이트, 64비트
  • char 1바이트, 8비트
  • bool 1바이트, 8비트

가 각각의 변수 자료형에 정해진 크기이며,
이 크기의 차이로 인해서 int 형에 담을 수 없는 큰 숫자를 long long 형에는 담을수 있거나 하는 차이가 생겨나게 됩니다.

구체적으로
int 자료형은 "부호비트" 한 개를 제외하고 31개의 비트를 사용해
2^31-1 까지의 숫자를 저장할 수 있고, 이는 21억(2,147,483,647) 입니다.

char형 변수와 아스키코드드

char형 변수는 1바이트, 8비트의 크기를 가지고 있기 때문에,
부호비트를 제외하고 최대 2^7-1 = 127개의 숫자를 저장할 수 있습니다.
수의 범위로 보면 -128 ~ 127 까지입니다.

앞선 내용에 의하면 char형 변수는 분명 하나의 "글자" 를 저장할 수 있었는데, 실제로는 비트로 구성되어 있기 때문에 숫자밖에 저장할 수 없습니다.

따라서 0부터 127의 128개의 숫자에 글자를 한개씩 연결지어 주는 방식으로 문자를 저장하기로 결정했고, 이 숫자-글자 의 연결을 표로 표기한 것이
아스키코드 표가 됩니다.

JavaStudy] 4. 아스키코드, Char, String 변환과 응용

아스키 코드의 왼쪽 열은 10진 숫자를,
가운뎃 열은 16진수로 표기한 10진 숫자를,
오른쪽 열은 숫자에 대응하는 문자를 적어둔 표의 모습입니다.

char형 변수에 'A' 를 저장한다면, 실제로는 65라는 값이 변수에 저장되지만, 출력할때 알맞게 'A'로 다시 변환되는 과정을 거치게 됩니다.
그렇기 때문에 문자 'A' 에도 사칙연산 등을 적용해 볼 수 있으며, 이러한 특성을 이용해야 해결할 수 있는 문제들이 존재합니다.


추가로, 아스키 코드 표 앞부분에 존재하는 특수문자들 중에는

  • 문자열의 끝을 알리는 \0
  • 엔터임을 의미하는 \n

등의 다양한 이스케이프 시퀀스 문자열들이 들어가 있습니다.
엔터키도 문자의 일종으로써 저장할 수 있다 정도만 기억해두시면 될것같습니다.

문자에 대한 사칙연산

11654번: 아스키 코드

입력받은 문자의 아스키코드를 그대로 출력하는 문제입니다.
입력받은 숫자가 내부적으로는 그대로 저장되어있기 때문에, 형변환을 통해서 int형으로 만들어주면 됩니다.

#include <iostream>
using namespace std;

int main(){
	char c;
	cin >> c;
	cout << (int)c;
	return 0;
}

변수나 계산한 값 앞에 (자료형) 을 붙이면 강제적으로 형변환을 시켜줄 수 있으며, (int) 를 붙여서 char형 변수 c를 int형으로 출력하게 했습니다.


2744번: 대소문자 바꾸기

대소문자를 바꿔주는 문제입니다.
아스키 코드 표 상에서 대문자와 소문자 둘의 차이가 동일하기 때문에,
특정한 숫자 32를 더하고 빼는 것으로 답을 얻을 수 있습니다.

여기서 32라는 숫자를 암기하실수도 있지만,
문자에 숫자가 한개씩 할당되어 있다는 정보를 이용해서
'a'-'A' 로 32라는 숫자를 유도해 내실수도 있습니다.

'a' 는 97, 'A' 는 65이기에 97-65 = 32로 동일한 숫자를 얻을 수 있습니다.

계산 과정에서 int형으로 형변환이 일어나기 때문에, 다시 char형으로 형변환 해야함에 유의해주시면 문제를 해결할 수 있습니다.


비슷한 방법으로, 문자 '0' 부터 '9' 를 숫자 0~9 로 변환하는 방법도
C - '0' 처럼 계산해줄 수 있습니다.
char형 변수 C에는 '0' 부터 '9' 사이의 값이 들어갑니다.

결론

아스키 코드라는것 만을 알아보기 위한 문제는 의외로 별로 없습니다만, 이 역시 모르면 풀 수 없거나 if문을 엄청나게 많이 작성해야 한다는 점에서 다루어 보았습니다.

앞으로 C언어를 더 보면 볼 수록 비트를 다루거나 하는 컴퓨터 시스템에 가까워 지게 됩니다. 타 언어에 비해서 컴퓨터 시스템에 접근이 조금 더 자유롭다는게 주요한 특징인 언어인만큼 여기서 잘 배워두시면
컴퓨터 공학 전반에서 재사용할 수 있는 지식들이 됩니다.