반응형
DoZZang
Do IT
DoZZang
전체 방문자
오늘
어제
  • Programming
    • Git
    • Web
    • 기타
    • Python
      • CodeUp
    • Math
    • Algorithm
    • Baekjoon
    • C,C++
    • Life
      • 독서
      • Just
      • 영화

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DoZZang

Do IT

공용체(union),리틀 엔디안(Little Endian)과 빅 엔디안(Big Endian)
C,C++

공용체(union),리틀 엔디안(Little Endian)과 빅 엔디안(Big Endian)

2022. 9. 6. 22:00
반응형
공용체(Union)

많이 사용하는 것은 아니지만 C언어에서 제공하는 것들 중 하나입니다.

공용체는 구조체와 비슷하지만 구조체와 달리 메모리를 '공유'합니다.

예를 들어보면

struct A                                           

{

  int i;

  char j;

};

메모리를 도식화 해본 것. 한 칸은 1byte라 가정

구조체는 이와 같이 int i와 char j가 차지하고 있는 메모리는 독립적입니다. 저희가 알고있는 것과 같죠.

그렇다는 공용체는?

union A

{

  int i;

  char j;

};

위 그림처럼 각 멤버들의 시작주소는 동일합니다. 즉 메모리를 공유하고있습니다.

테스트해보기 위해 코드를 보겠습니다.

#include <stdio.h>
union A {
  int i;
  char j;
};
int main() {
  union A a;
  a.i = 0x12345678; // 4바이트
  printf("%x", a.j);
  return 0;
}

오! 진짜 공유하는 것은 확인이 되었습니다!!! 하지만

위 코드를 컴파일하면 0x12가 아닌 0x78이 나오게 됩니다.

그 이유는 컴퓨터의 바이트 정렬 방식에 있습니다.

빅 엔디안(Big Endian)

int i에 0x12345678을 대입한다면 메모리는 이럴 것 같습니다.

<각 한 칸은 1byte라 가정>

위와 같이 상위비트부터 낮은 주소 값에 넣는 것을 빅 엔디안이라고 합니다.

예전 RISC 계열의 컴퓨터에서는 빅 엔디안 방식을 사용했다고 합니다.

하지만 최근 저희의 컴퓨터는 리틀 엔디안 방식을 사용합니다.

리틀 엔디안(Little Endian)

<각 한 칸은 1byte라 가정>

리틀 엔디안은 위와 같이 상위비트부터 높은 주소 값에 들어간 것을 알 수 있습니다.

(메모리는 1바이트를 기준으로 배치되기 때문에 0x12가 0x21로 보관되지는 않습니다.)

Windows 프로세서는 대부분 리틀 엔디안 방식을 적용하고 있습니다. 따라서 위의 공용체 예시에서 0x78이 나오게 된 것 입니다.

(출처:https://modoocode.com/71)

Union은 어떤 형의 변수가 들어올지 모를 때 공간을 효과적으로 쓰기 위해서라면 효율적일 것 같습니다.

-> 찾아보니 정말 '구조체는 데이터를 효율적으로 쓰기 위하여 사용하고 공용체는 특정 공간을 효율적으로 쓰기 위하여'라는 구절을 봤습니다!

반응형
저작자표시 (새창열림)

'C,C++' 카테고리의 다른 글

[C++] 7569번: 토마토  (0) 2024.03.21
많은 수의 전역변수를 선언하면 안될까?  (0) 2022.09.07
    'C,C++' 카테고리의 다른 글
    • [C++] 7569번: 토마토
    • 많은 수의 전역변수를 선언하면 안될까?
    DoZZang
    DoZZang
    과정은 힘들지만 성장은 즐겁습니다.

    티스토리툴바