본문 바로가기
프로그래밍/C, C++

C 언어 공용체 (union)

by argentdarae 2025. 4. 10.
반응형

공용체는 구조체와 문법이 비슷하지만, 모든 멤버가 같은 메모리 위치를 공유한다

즉, 공용체의 크기는 가장 큰 멤버의 크기로 결정되는 것이다

 

여러 자료형을 동시에 저장하지는 못하지만, 동일 메모리 공간을 다르게 해석하고 싶을 때 유용하다

#include <stdio.h>

/* 
   union + 비트 필드 예시:
   - 같은 메모리를 두 가지 방식으로 해석하려는 목적.
   - 하나는 비트 필드 구조체로 해석하고,
     다른 하나는 raw(16비트 정수) 값으로 직접 해석할 수 있다.
*/

/* 비트 필드 구조체 (16비트) */
typedef struct {
    unsigned short is_on       : 1;  /* 1비트 (켜짐/꺼짐) */
    unsigned short is_enabled  : 1;  /* 1비트 (활성화/비활성화) */
    unsigned short mode        : 2;  /* 2비트 (모드 0~3) */
    unsigned short reserved    : 12; /* 남는 공간 12비트, 추후 확장용 */
} FlagBits_t;

/* 공용체: 같은 메모리를 2가지 관점으로 해석 */
union Data {
    FlagBits_t bits;    /* 비트 필드로 접근 */
    unsigned short raw; /* 16비트 정수로 직접 접근 */
};

int main(void)
{
    /* 1) 공용체 선언 */
    union Data d;

    /* 2) 비트 필드 초기화: 전체 0 */
    d.raw = 0;  

    /* 3) 비트 필드에 값 세팅 */
    d.bits.is_on      = 1; /* 켜짐 (1) */
    d.bits.is_enabled = 1; /* 활성화 (1) */
    d.bits.mode       = 2; /* 모드값 2 설정 */

    /* 4) 비트 필드 멤버 출력 */
    printf("d.bits.is_on       = %d\n", d.bits.is_on);
    printf("d.bits.is_enabled  = %d\n", d.bits.is_enabled);
    printf("d.bits.mode        = %d\n", d.bits.mode);

    /* 5) 공용체 raw 값 출력 (16진수) */
    printf("d.raw (hex)        = 0x%04X\n", d.raw);

    /* 6) raw에 직접 값을 넣으면, 비트 필드도 바뀜 */
    d.raw = 0x00A5; /* 예: 1010 0101(2) in low byte, 0000 0000 in high byte */

    /* 7) 비트 필드가 어떻게 해석되는지 다시 출력 */
    printf("\nAfter d.raw = 0x00A5;\n");
    printf("d.bits.is_on       = %d\n", d.bits.is_on);
    printf("d.bits.is_enabled  = %d\n", d.bits.is_enabled);
    printf("d.bits.mode        = %d\n", d.bits.mode);
    printf("d.raw (hex)        = 0x%04X\n", d.raw);

    return 0;
}



================ 실행 결과 ================
d.bits.is_on       = 1
d.bits.is_enabled  = 1
d.bits.mode        = 2
d.raw (hex)        = 0x000B

After d.raw = 0x00A5;
d.bits.is_on       = 1
d.bits.is_enabled  = 0
d.bits.mode        = 1
d.raw (hex)        = 0x00A5

Reference

Union declaration - cppreference.com

'프로그래밍 > C, C++' 카테고리의 다른 글

C 언어 void 포인터 (void*)  (0) 2025.04.10
C 언어 함수 포인터  (0) 2025.04.10
C 구조체와 비트 플래그  (0) 2025.04.10
C 구조체 사용 시 포인터 저장 문제  (0) 2025.04.09
C 언어의 구조체  (0) 2025.04.09