인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

톨스토이님의 프로필 이미지

작성한 질문수

독하게 시작하는 C 프로그래밍

공용체

공용체에 int, char 형 선언 후 값 읽기

해결된 질문

작성

·

87

0

문득 궁금한건데 아스키코드가 ’A’ 는 65잖아요

예를들어

union Data

{

int intValue;

char charValue;

};

 

이고 main함수에 charValue 값만 ‘A’ 로 대입 해주고 printf를 통해 intValue 값을 출력하면 65가 나오더라구요 이게 왜 이러는건가요?

메모리내에 값이 [41] [xx] [xx] [xx] 같이 0x41 값을 제외하고는 모두 쓰레기값일텐데 왜 65를 잘 출력하는거죠?

좀 헷갈립니다.

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

C언어에서 'A'는 정수 65와 사실 상 차이가 없습니다. 그리고 getchar() 함수의 반환 형식은 char가 아니라 int이며 char나 int 모두 '정수형'에 속합니다. 이 점에 대해 생각해보면 답이 쉽게 나올 수 있습니다. 대부분 Little endian 방식을 사용하는 인텔 x86호환 CPU를 사용할 것이므로 65는 0x41이 되겠으나 Little endian의 특성상 주소값 자체가 작은 주소에 0x41이 저장될 것입니다. 그런 이유로 디버거 메모리 윈도우에서 값이 [41][00][00][00]로 보이는 것입니다.

그리고 공용체는 같은 대상 메모리에 대해 다양한 해석 방식을 적용하는 문법입니다. 접근을 char 형으로 하더라도 더 큰 공간이자 기본형식에 해당하는 int 멤버를 고려해 4바이트 공간이 필요할 것이고 여기에 값을 65로 초기화 한다면 남는 영역은 2의 보수 표기에 따라 모두 0으로 채워질 수 밖에 없습니다. 참고하시기 바랍니다. 😃

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 톨스토이님.

공용체(union)를 사용하면, 공용체 내의 모든 멤버가 동일한 메모리 공간을 공유합니다. 즉, 공용체 내에 어떤 멤버에 값을 쓰든, 다른 멤버도 그 값을 참조하게 됩니다. 여러분이 예로 든 공용체에서 ‘charValue’에 ‘A’를 대입하면, 이는 아스키 코드 값 65에 해당하는 0x41이 됩니다. 이 값이 메모리에 저장될 때, 4바이트 정수로 해석되어 ‘intValue’에서 동일한 숫자를 출력을 얻게 되죠.

메모리 공간이 [41] [xx] [xx] [xx]로 보일 수 있지만, 41이 이진수로 중간 바이트들에 영향을 끼치지 않기 때문에 ‘intValue’는 여전히 65로 해석됩니다. C 언어에서는 리틀 엔디안(하위 바이트부터 저장) 방식을 사용하는 경우가 많으므로, 이런 바이트 정렬이 가능합니다. 이는 대입한 바이트(0x41)만이 영향을 끼치고 나머지는 사용되지 않아 보이지만, intValue 자체의 큰 값으로 해석될 수 있는 것입니다.

위 내용을 잘 이해하실 수 있도록 관련된 유사 질문을 참고하시기 바랍니다:
- 유사 질문: 공용체와 자료형 크기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.