해결된 질문
작성
·
36
1
안녕하세요 교수님. 질문이 있는데,
char의 값은 그대로 int로 표현하면 에러없이 정상 작동하는데 char가 int보다 크기가 작은 자료형이고 같은 정수형이라서 자동으로 형변환이 되는거라 제대로 출력이 되는것이고,
int값을 char로 표현하면 에러가 뜨는 이유는 같은 정수타입이지만, char의 크기가 작아서 int를 표현하지 못해서 그러는걸까요?
그래서 getchar랑 putchar는 int로 받지만, EOF를 사용안할떄 char로 해도 정상작동되는걸까요?
그리고, EOF는 char타입일떈 못쓴다던데 그렇다면 보통 getchar와 putchar는 int변수로 주로 받는건가요? 근데 이러면 1바이트인 char를 못쓰니 손해를 보는편일까요?
답변 2
1
안녕하세요, 질문&답변 도우미 durams입니다.
char
과 int
는 동일한 정수형 타입이라는 범주에 속하지만, 정보를 나타내기 위한 비트의 수가 다르기 때문에 표현 가능한 값의 범위가 다르다는 걸 알고계실겁니다.
char
-> int
: 승격(promotion)으로, 값이 온전히 보전됩니다.
int
-> char
: 값의 범위가 작아지기 때문에, truncation(잘림)이 발생할 수 있습니다.
단순히 int
값을 char
에 할당한다고 해서 에러가 발생하지는 않습니다만, 질문글만으로는 제가 정확한 상황을 알기에는 어렵네요.
네. 단순히 문자 하나를 입력받는 것이 목적이라면 char
로 받아도 무방합니다. 하지만 EOF 검사가 필요하다면 반환 타입을 int
로 지정하셔야 합니다.
필요에 따라 char
또는 int
중 선택하여 사용하시면 될 것 같습니다.
getchar
의 경우 단일 문자를 입력받을 목적으로 사용합니다. 이때 int
대신 char
를 사용한다고 해도 실제 성능이나 메모리 사용량에 거의 영향을 주지 않습니다. 현대적인 컴퓨터에서는 매우 미미한 차이이며, 실제 속도/공간 면에서의 최적화는 사용하는 알고리듬 등에 따라 좌우되는 경우가 많습니다.
수많은 문자를 입력받는 경우에는 1바이트와 4바이트의 격차가 커지지 않을까 싶을수도 있지만, 문자열을 입력받는 경우에는 getchar
가 아닌 fgets
등의 함수를 사용해서 char
포인터를 반환하기 때문에, 크게 신경쓰지 않으셔도 될 것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다. luki님.
질문 주신 내용에 대해 답변 드리겠습니다.
char와 int의 호환성: char
는 int
보다 크기가 작고, int
는 일반적으로 4바이트, char
는 1바이트입니다. 따라서 char
를 int
로 변환할 때는 데이터가 작아서 문제없이 자동 형변환이 이루어져 정상적으로 작동합니다. 반대로, int
를 char
로 변환하려 하면, char
가 1바이트 크기라서 int
의 모든 값을 표현할 수 없기 때문에 데이터 손실이 발생할 수 있으며, 이런 경우 종종 예상치 못한 결과가 나옵니다.
getchar와 putchar의 자료형: getchar()
와 putchar()
는 EOF
(End of File)를 처리하기 위해 int
타입을 사용합니다. EOF
는 일반적으로 -1로 정의되며, 이 값은 char
로 표현할 수 없기 때문에 int
를 사용합니다. char
변수가 EOF
같은 특수한 값을 표현할 수 없기 때문에, EOF
를 처리할 때는 반드시 int
로 리턴 값을 받아야 합니다.
char 사용의 손실: getchar()
와 putchar()
에서 int
를 사용하지만, (1바이트의) 실제 문자 데이터를 처리하는 데는 큰 문제가 없습니다. 기본적으로 문자열이나 문자들을 처리하는 데 있어서는 char
타입을 계속 사용할 수 있으며, EOF
체크 등과 같은 경우에만 int
타입으로 다루면 됩니다. 따라서 성능 손실은 미미하고, 안전한 데이터 처리를 위해 필요한 조치입니다.
관련 내용을 다룬 기존의 질문과 답변을 확인하고 싶으시다면:
- 자료형 확인질문입니다
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.