반응형
공용체는 구조체와 문법이 비슷하지만, 모든 멤버가 같은 메모리 위치를 공유한다
즉, 공용체의 크기는 가장 큰 멤버의 크기로 결정되는 것이다
여러 자료형을 동시에 저장하지는 못하지만, 동일 메모리 공간을 다르게 해석하고 싶을 때 유용하다
#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
'프로그래밍 > 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 |