C & C++/디딤돌 C언어

Part 5. 문자 형식과 ASCII 코드

언휴 2024. 1. 9. 08:50

Part 5. 문자 형식과 ASCII 코드

15. ASCII 코드

 

C언어 - 문자 형식과 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’

답:
printf 함수에 포멧을 %d로 지정하여 문자의 아스키 코드 값을 출력합니다.
//다음 문자의 아스키 코드 값이 얼마인지 확인하는 코드를 작성하시오.
//‘0’, ‘9’, ‘a’, ‘z’, ‘A’, ‘Z’
#include <stdio.h>
int main(void)
{
    printf("'0' : %d\n",'0');
    printf("'9' : %d\n",'9');
    printf("'a' : %d\n",'a');
    printf("'z' : %d\n",'z');
    printf("'A' : %d\n",'A');
    printf("'Z' : %d\n",'Z');
    return 0;
}

▷ 실행 결과

'0' : 48
'9' : 57
'a' : 97
'z' : 122
'A' : 65
'Z' : 90

 

16. char 형식으로 정수 표현, 형변환

2024 년 3월 19일에 유튜브에 동영상 강의를 재작성한 후 업로드할 예정입니다.

C언어 char 형식, 정수 형식, 표현 범위, overflow, 값 잘림 현상

C언어에서는 char 형식도 정수 형식으로 취급한답니다.
문자를 표현할 때도 사용하지만 표현 범위가 -128~127 사이의 정수를 나타낼 때도 사용할 수 있어요.

 

특히 C언어에서 제공하는 정수 형식 사이에서는 서로 대입하거나 비교를 할 수 있어요.


프로그래밍에서 서로 다른 형식 사이에 대입하거나 비교하기 위해 형식을 변환하는 것을 형변환이라 불러요.
특정 형식 사이에서는 별다른 표현을 하지 않아도 내부적으로 형변환을 해 주기도 하는데 이를 묵시적 형변환이라고 말하죠.
만약 서로 다른 형식 사이에 대입하거나 비교하는 구문이 있어도 컴파일에 문제가 없다면 묵시적 형변환을 제공하는 거예요.

그리고 개발자가 명확하게 형식 변환을 표현하는 것을 명시적 형변환이라고 말해요.

 

◈ char 형식과 int 형식 사이에 형 변환

#include <stdio.h>
int main()
{
    int i = 27;
    char c= 0;
    
    c = i; // i 변수의 값을 char 형식으로 묵시적 형변환하여 c변수에 대입함
    printf("c : %d \n",c);
    c = (char)i; //i 변수의 값을 char 형식으로 명시적 형변환하여 c변수에 대입함
    printf("c : %d \n",c);
    return 0;
}

◈ 실행 결과

c : 27
c : 27