15. ASCII 코드

C언어에서 char 형식은 -128~127까지의 정수를 표현할 수 있는 정수 형식이예요.

형식 이름을 보면 알 수 있듯이 char 형식은 문자를 표현할 때 많이 사용하죠.
미국 표준 기구(ANSI, American National Standards Instutitute)에서는 영문 알파벳과 숫자 문자와 여러 기호를 아스키 코드로 정의했어요.

아스키 코드에는 128개의 문자를 약속하고 있답니다.
최초의 아스키 코드는 하드웨어 사이에서 주고 받는 신호를 약속한 것으로 제어 신호도 포함하고 있어요.

char 형식이 8비트(1바이트)죠.
첫번째 비트는 0이고 나머지 비트를 아스키 코드를 이용하여 표현해요.

예를 들어 8비트의 메모리에 01100001 값이 있으면 문자 a를 의미하고 01100010이면 문자 b를 의미해요.
이처럼 ASCII 코드에서는 128가지의 문자마다 특정한 값을 약속하였는데 이를 모두 기억하는 것은 매우 어려운 일이겠죠.
C언어에서는 ‘a’처럼 단일 콤마 사이에 하나의 문자를 표현하는 리터럴 표현을 제공하고 있어요.
따라서 ‘a’로 표현하면 메모리에 01100001 값으로 표현해 준답니다.

◈ ASCII 코드 값 확인

#include <stdio.h>
int main()
{
    printf("a:%d b:%d A:%d B:%d 0:%d 1:%d \n",'a', 'b', 'A', 'B', '0', '1'); 
    return 0;
}

◈  실행 결과
a:97 b:98 A:65 B:66 0:48 1:49 

ASCII 코드
ASCII 코드

아스키 코드에는 문자외에도 데이터 전송 시작, 끝 등을 나타내는 제어 신호도 있어요.
아스키 코드는 원래 하드웨어와 하드웨어, 하드웨어와 운영체제 사이에 주고 받는 신호들을 약속한 것이기 때문이예요.
이러한 이유로 프로그램에서 문자를 표현할 때 사용하지 않는 값들도 포함하고 있답니다.

다음은 아스키 코드의 특수 문자와 제어 신호들이예요.
여러분들이 C언어를 배우는 과정에서 이를 알아야 할 필요는 없으니 가볍게 참고만 하세요.

◈ 아스키 코드의 특수 문자와 제어 신호
다음은 아스키 코드에서 약속한 특수 문자와 제어 신호예요.
NUL : NULL
SOH : 데이터 전송 시작
STX : 본문 시작, ETX: 본문 종료, EOT: 전송 종료, ETB: 전송 블록 종료
ENQ: 응답 요구, ACK: 긍정 응답
BEL: 경고음
BS: Back Space
HT:수평 탭, LF: 개행, VT: 수직 탭, FF: 다음 페이지, CR:Carrige Return
SO: 확장 문자 시작, SI:확장 문자 종료
DFL: 전송 제어 확장
DC1: Device Control 1, DC2: Device Control 2
DC3: Device Control 3, DC4: Device Control 4
NAK: 부정 응답, SYN: Synchronous Idle, CAN: 취소
EM: 매체 종료
SUB: 치환
ESC: Escape
FS: 파일 경계, GS: 그룹 경계, RS: 레코드 경계, US: 장치 경계

C언어에서 문자 리터럴을 사용하는 것과 ASCII 코드 값을 사용하는 것은 차이가 없어요.
개발자가 모든 문자의 ASCII 코드 값을 기억하지 않아도 프로그래밍할 수 있게 문자 리터럴을 제공하는 것이죠.

◈ 문자 리터럴과 ASCII 코드 비교
#include <stdio.h>
int main()
{
    printf("%d %d \n", 97, 'a');
    printf("%c %c \n", 97, 'a');
 
    if(97 == 'a') //조건 (97과 'a'가 같으면)
    {
        printf("같다. \n");
    }
    else
    {
        printf("다르다.\n");
    }
    return 0;
}

◈ 실행 결과
97 97
a a
같다.

◈ 기본 연습 (정답 바로가기)
다음 문자의 아스키 코드 값이 얼마인지 확인하는 코드를 작성하시오.
‘0’, ‘9’, ‘a’, ‘z’, ‘A’, ‘Z’