티스토리 뷰

비트필드(bit field)는 구조체 멤버가 바이트 단위가 아닌 비트 단위 데이터를 다루는 멤버로 선언되는 구조체이다.

 

만일 비트필드를 이용하지 않고도 일정 비트를 잘라내려면 마스크 연산을 비롯한 각종 비트연산을 수행해야 한다.

 

#include<stdio.h>


//비트필드 구조체 선언 및 정의
typedef struct _DATAFLAG{
    unsigned char main : 1; //8비트 중 오른쪽 1비트
    unsigned char left : 2; //오른쪽 2~3번째 비트
    unsigned char right : 3; //오른쪽 4~6번째 비트
    unsigned char top : 2; //오른쪽 7~8번쨰 비트 (왼쪽 두 비트)
} DATAFLAG;

int main(void) {
    //1비트 표현범위: 0~1
    //2비트 표현범위: 0~3 (4는 범위를 넘어선 값이다!)
    //3비트 표현범위: 0~7
    DATAFLAG flagSwitch = {0, 3, 7, 4};
    
    printf("%d\n", flagSwitch.main);
    printf("%d\n", flagSwitch.left);
    printf("%d\n", flagSwitch.right);
    //4는 2비트 표현범위를 넘어선 값이므로 출력할 수 없다(0 출력).
    printf("%d\n", flagSwitch.top);
    
    printf("%x\n", *((unsigned char *)&flagSwitch));
    printf("%d\n", sizeof(flagSwitch));
    
    return 0;
}

 

 

공용체(union)는 한 가지 자료에 대해 여러가지 해석방법(자료형)을 부여하는 문법이다.

 

#include<stdio.h>

//IP_ADDR '공용체' 선언 및 형 재선언
//4바이트를 세 가지 형식으로 달리 해석할 수 있도록 선언한다.
typedef union _IP_ADDR {
    int nAddress;
    short awData[2];
    unsigned char addr[4];
} IP_ADDR;

int main(void) {
    IP_ADDR Data = {0};
    Data.nAddress = 0x41424344;
    
    //0x41424344를 8비트씩 0x41, 0x42, 0x43, 0x44 넷으로 잘라
    //영문자로 출력한다.
    printf("%c%c%c%c\n", Data.addr[0], Data.addr[1], Data.addr[2], Data.addr[3]);
    //16비트씩 둘로 잘라 출력한다.
    printf("%X, %d\n", Data.awData[0], Data.awData[0]);
    printf("%X, %d\n", Data.awData[1], Data.awData[1]);
    return 0;
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함