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"#1. 내 머리 속의 노트 / C 언어 마스터 Go! gO!" 분류의 다른 글
| C언어 난관 2 [열혈강의 C p.115] char_add.c (8) | 2010/02/23 |
| C :: typedef으로 함수 포인터를... (2) | 2009/08/25 |
| C :: null 포인터, null 문자, 정수 0에 관한 이야기 (2) | 2009/06/24 |
| C :: srand(time(null)) 과 usleep() 함수 (4) | 2009/04/11 |
| C :: 1byte씩 메모리 읽기 (2) | 2009/02/28 |
| C :: 실수(Float)를 엿보려면 컴퓨터를 속여라. (4) | 2009/02/15 |
| C :: 포인터는 포인터일뿐 이상도 이하도 아닙니다. (2) | 2009/02/13 |
| C :: multiple definition 에러 (0) | 2009/02/01 |
| C :: 컴퓨터와 가위바위보를 하자. - 코딩편 (0) | 2009/01/17 |
| C :: 컴퓨터와 가위바위보를 하자. - 설계편 (0) | 2009/01/16 |
Trackback Address:http://hisjournal.net/blog/trackback/180