질문있습니다

kyk642 Reply 9 years 4 weeks ago
문제에 관한건 아니고 공부 내용에 관한 것인데, 어디에 물어봐야할지 모르겠어서 여기에 물어봅니다. 1) 책에보면 getchar과 putchar을 쓰는 이유가, getchar이 반환할수 있는 모든 value를 c가 저장할 수 있어야하는데, EOF만큼 큰 값을 받으려면 c가 int로 선언되야한다고합니다. 그리고 위에서 int의 범위가 -32768에서 +32767이라고 하는 것을 보니 2's complement방식으로 부호를 결정하는 것 같고, char에서도 마찬가지 일것이라고 생각됩니다. 그렇다면, EOF는 보통 -1로 정의가 되니까 어떤 integer변수형에서도 1111......10으로 표현되면 되는 것이 아닌가요? 2) 아스키코드표에 26번이 ctrl-z SUB라고 되어있습니다. 이게 무슨말인지를 모르겠습니다. ctrl+z를 입력하면 sub라는 기능을 수행하는 변수가 c에 입력이 된다는 말인가요? 그렇다면 윈도우에서는 sub라는 기능이 실행될 방법이 없지않나요?
kyk642 Reply 9 years 4 weeks ago
1) 질문의 요점은 어떤 변수형을 쓰든 111...0을 쓰면 되니까 char을 써도 되지않나는 말입니다. 실제로, 어떤 운영체제는 int를 16비트로 처리하는곳도 있다고 들었는데, char도 2바이트니 책에서의 논리면 int를 16비트로 처리하는 운영체제에서는 int c; c=getchar() 코드에서 EOF를 넣으면 오류가 나야할 것 같습니다.
booksky Reply 9 years 4 weeks ago
1) char은 2바이트가 아니라 1바이트(8비트)입니다. EOF는 -1로 정의되어있기 때문에, 어떤 변수형일지라도 1111......110이 아니라 1111...111로 정의되겠죠.(2's complement에 대해서 좀 더 공부하시기 바랍니다.) byte면 11111111 short면 1111111111111111 long이면 11111111111111111111111111111111 -1은 이렇게 정의될 것입니다. 그리고 char는 실질적으로는 byte와 같은 변수니까 11111111이겠죠. 질문의 초점은, int c; c = getchar(); 로 받았을 때 왜 if(c == EOF)를 했을 때 오류가 나야할 거 같은데 오류가 안 나는가에 대한 내용인데, 일단 결론부터 말하자면 c가 char이건 short건 long이건 long long이건 정수형 변수가 들어온다면 저 코드는 오류가 나지 않을 것입니다. c값이 뭐건간에 c == EOF로 비교할 때, type conversion이 발생할 것입니다. 그러면 EOF는 c의 변수형에 맞는 -1값으로 변경되어 c값과 비교를 해주게 되겠지요. 2) http://en.wikipedia.org/wiki/Substitute_character 이 항목을 읽어보시면 SUB에 대해서, 그리고 왜 EOF와 같은 키를 할당받았는지 자세히 알 수 있을 것입니다.
kyk642 Reply 9 years 4 weeks ago
아뇨 제 질문의 초점은 c가 char이든 short이든 long이든 int든 수행이 되야하는데 교재에는 EOF를 받기위해 char은 안되고 int를 써야한다는 문구가 있어서 질문드린거였습니다만..
kyk642 Reply 9 years 4 weeks ago
2번질문은 해결된것 같습니다 감사합니다