프로그래밍/C,C++,C#

[C] 공용체(union) 변수 사용 (feat. 콜론 연산자)

Beginner:) 2023. 4. 7.
320x100

제목에서 알 수 있다시피, 메모리를 공유하는 변수가 존재한다.

 

만약 0b00010100(20)이라는 숫자에서 bit 4번째 숫자만 0으로 바꾸고 싶다면?

 

비트마스킹을 이용하여 0b11101111을 and 연산을 할 수 있다.

 

상황에 따라 인덱스를 접근하는 함수를 만들고, 어려운 변수 값을 집어넣고... 연산하고...

이게 한눈에 보기 어렵다는 것이다 -> 가독성이 떨어짐

 

공용체를 사용하면 좀 더 보기 쉽게 사용이 가능하다.

 

(이외에 임베디드쪽에서 ON/OFF 식의 센서 값을 모아서 관리하거나, 프로토콜 프레임 등 규칙성이 있는 정보를 관리하는데 효율적으로 사용된다)


아래는 소스코드.

 

#include <stdio.h>

typedef union{
    unsigned char BYTE;
    struct{
        unsigned char bit0:1;
        unsigned char bit1:1;
        unsigned char bit2:1;
        unsigned char bit3:1;
        unsigned char bit4:1;
        unsigned char bit5:1;
        unsigned char bit6:1;
        unsigned char bit7:1;
    }BIT;
}Data;
Data test_data;

void main()
{
    test_data.BIT.bit0 = 1;
    test_data.BIT.bit2 = 1;
    test_data.BIT.bit4 = 1;
    test_data.BIT.bit6 = 1;

    printf("size = %ld, byte = %d\n",sizeof(test_data), test_data.BYTE);
    return;
}

 

 

 

union이라는 것을 처음 본다면, 중괄호 안에 unsigned char 변수 하나, unsigned char 변수 8개의 구조체...

 

총 9Byte의 변수라고 생각할 수도 있지만, 1Byte이다.

 

공용 메모리를 쓰기 때문이고, 콜론 연산자는 bit 수를 나타내기 때문에 8bit = 1byte를 공용 메모리로 사용 중인 것이다.

 

구조체 BIT의 0, 2, 4, 6을 1로 바꾸었고, 공용 메모리를 사용하는 BYTE 변수도 bit값이 바뀌면서 0b01010101(85)를 출력하게 된다.

 

반응형

댓글