c++ 초보자입니다.기초적인질문드립니다.

조회수 832회

다음 코드에서 최종적으로 uni.i가 갖는 값은 어떻게 될까? 16진수로 답해보자. union UNI {
int i; char c; } uni; uni.i = 0x12345678; uni.c = 0x90;

답:0x12345690 uni.c의 값을 변경하는 것은 uni.i의 마지막 바이트를 변경하는 것과 같다

이렇게 답지에는 나와있는데 초보자인 제 입장에서는 대체 왜 uni.i뒤에 uni.c가 들어가는지 이해가 가지 않습니다. 독학중인 책 앞에서 설명으로는 공용체인 union은 같은 주소안에 여러 타입의 변수들을 넣는데 한 변수에 변화가 있으면 다른 타입의 변수또한 그 영향을 받는다고 배웠습니다. 근데 여기는 왜 uni.i가 뒤늦게 초기화된 uni.c의 값과 똑같아 지지 않고 이어붙어져서 0x1234567890 이 되는지 모르겠습니다. 고수분들의 답변 부탁드립니다. 그리고 혹시나 독학하는 사람들을 위해서 c++를 자세하게 배울수 있는 팁이 있다면 소개해주세요. 전공자도 아니고 혼자서 책을보고 하려니 부가설명도 없고 답지도 허술해서 고통스럽습니다..

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • http://itguru.tistory.com/71

    여기 들어가시면 원하시는 답변을 찾으실 수 있을거에요

    이 사이트에서 C언어부터 한번 전체적으로 보시고 C++보시길 추천드립니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • Union은 같은 메모리를 다른 자료형으로 바라보는 것입니다.

    uni.i 와 uni.c 가 가리키는 주소는 같으며, 실제로 저장되는 메모리 위치도 동일합니다.

    uni.i 는 int 형이므로 32비트(4바이트) 만큼을 차지해서 0x12 / 0x34 / 0x56 / 0x78 4바이트에 모두 접근할 수 있는 반면, 같은 곳을 가리키지만 uni.c 는 char 자료형이므로 저 네 메모리 주소 중 8비트(1바이트) 하나인 0x78 에만 접근할 수 있습니다.

    정렬은 앞쪽부터 됩니다. 하지만 이게 앞이 어디냐는 컴퓨터 구조마다 다를 수 있습니다. uni.c 가 가리키는 곳이 0x12 가 있는 메모리 위치이냐 아니면 0x78이 있는 메모리 위치이냐는 빅 엔디안 / 리틀 엔디안 여부에 따라 달라집니다. "엔디안" 에 대해서 찾아보시길 권해드립니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)