c++ 초보자입니다.기초적인질문드립니다.
조회수 834회
다음 코드에서 최종적으로 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 답변
-
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
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이 있는 메모리 위치이냐는 빅 엔디안 / 리틀 엔디안 여부에 따라 달라집니다. "엔디안" 에 대해서 찾아보시길 권해드립니다.
댓글 입력