C :: 0xE0 == 224 ?

2009/03/03 10:39

어느 한 분이 게시판에 질문을 올리셨습니다.

소코반 소스중에 일부분입니다.

int ch;

ch = getch(); //키 입력
if( ch==0xE0 ) {
//실행
}

0xE0 은 십진수로 224입니다.
그러면 ch==224 랑 같으면 실행 된다는 말인가요 ㅡ.ㅡ?

『혼자 연구하는 C/C++』에 나오는 한 예제에 대한 질문이었습니다.

C에서는 문자형으로 char가 사용됩니다. char는 1byte 자료형으로 -128~127의 값을 가집니다. 그럼 여기서부터 문제가 생기지요. 0xE0은 질문에서처럼 224를 뜻하거든요. 애초에 char로 이야기를 시작하면 핀트가 어긋나버리는 겁니다. 예제에도 나와있듯이 변수 ch는 (unsigned char를 이용해도 될 것 같지만)int로 선언되어 있습니다. 4byte 자료형이죠.

getch 함수는 방향키나 펑션키를 누르는 등 문자 이외의 키를 누르면 확장키(아스키 코드 이외의 코드)를 의미하는 0xE0이나 0을 반환한다고 합니다. 여기서 getch 함수를 한 번 더 호출하면 그 확장키의 코드를 조사하도록 되어 있다는군요.

질문의 예제 같은 경우는 방향키를 입력받는지 (메뉴에 이용되는)문자를 입력받는지 조사하는데, 0xEO을 조사한 후에 한 번 더 getch 함수를 호출하고 있습니다. 만약 0xE0이나 0을 조사하지 않고 getch 함수도 한 번 더 호출하지 않는다면, 방향키를 누르는 순간 K, M, H, P가 입력될 것입니다. 각각 Left, Right, Up, Down 을 뜻하는 75, 77, 72, 80과 충돌하죠.

그리고 0xE0 값은 아스키코드와 유니코드 사이에 변환할 때 이용되기도 합니다.

참고로 getch 함수가 포함되는 conio.h 파일은 ANSI C 표준에는 없는 것입니다. 즉, gcc에선 별도의 라이브러리를 이용하지 않는한 getch 함수는 못 쓰죠. 다만, stdio.h 파일에 getc 함수나 getchar 함수가 있습니다.

참고 문헌

입출력 함수 getch() :: http://itedu.tistor ··· 2598-getch
크리에이티브 커먼즈 라이센스
Creative Commons License

6l4ck3y3 #1. 내 머리 속의 노트/C 언어 마스터 Go! gO! , , , , , ,

Trackback Address:http://hisjournal.net/blog/trackback/180
[로그인][오픈아이디란?]