C 언어 비트 필드 (비트 세그먼트) 상세 설명

5203 단어 C 언어
C 언어 비트 필드 (비트 세그먼트) 상세 설명
다음으로 전송:http://c.biancheng.net/view/2037.html
일부 데 이 터 는 저장 할 때 완전한 바이트 하 나 를 차지 하지 않 고 하나 또는 몇 개의 바 이 너 리 만 차지 하면 된다.예 를 들 어 스위치 는 전기 가 통 하고 전기 가 끊 기 는 두 가지 상태 만 있 고 0 과 1 로 충분 하 다 는 것 을 나타 낸다. 즉, 2 진 을 사용 하 는 것 이다.바로 이러한 고려 를 바탕 으로 C 언어 는 비트 필드 라 는 데이터 구 조 를 제공 했다.
구조 체 가 정 의 될 때 우 리 는 특정한 구성원 변수 가 차지 하 는 바 이 너 리 자릿수 (Bit) 를 지정 할 수 있 습 니 다. 이것 이 바로 비트 필드 입 니 다.아래 의 예 를 보십시오.
struct bs{
    unsigned m;
    unsigned n: 4;
    unsigned char ch: 6;
}

: 뒤의 숫자 는 구성원 변수 가 차지 하 는 자릿수 를 제한 하 는 데 사 용 됩 니 다.멤버 m 는 제한 이 없 으 며 데이터 형식 에 따라 4 바이트 (Byte) 의 메모 리 를 차지 하 는 것 으로 추정 된다.구성원 n, ch: 뒤의 숫자 로 제한 되 어 데이터 형식 에 따라 길 이 를 계산 할 수 없습니다. 각각 4, 6 비트 (Bit) 의 메모 리 를 차지 합 니 다.
n. ch 의 수치 범위 가 매우 제한 되 어 있 습 니 다. 데이터 가 조금 만 크 면 넘 칠 수 있 습 니 다. 아래 의 예 를 보십시오.
  #include 
    int main(){
        struct bs{
            unsigned m;
            unsigned n: 4;
            unsigned char ch: 6;
        } a = { 0xad, 0xE, '$'};
        //     
        printf("%#x, %#x, %c
", a.m, a.n, a.ch); // a.m = 0xb8901c; a.n = 0x2d; a.ch = 'z'; printf("%#x, %#x, %c
", a.m, a.n, a.ch); return 0; } : 0xad, 0xe, $ 0xb8901c, 0xd, :

n 과 ch 에 대해 첫 번 째 출력 데 이 터 는 완전 하고 두 번 째 출력 데 이 터 는 부족 합 니 다.
첫 번 째 출력 시 n, ch 의 값 은 각각 0xE, 0x 24 ('$' 에 대응 하 는 ASCII 코드 는 0x 24) 이 고 이 진 으로 환산 하면 1110, 10 0100 으로 한 정 된 자릿수 를 초과 하지 않 아 정상적으로 출력 할 수 있 습 니 다.
두 번 째 출력 시 n, ch 의 값 은 0x2d, 0x7a ('z' 에 대응 하 는 ASCII 코드 는 0x7a) 로 바 뀌 었 고 이 진 으로 환산 하면 각각 10 1101, 111 1010 으로 모두 한 정 된 자릿수 를 초과 했다.초과 부분 은 직접 절단 되 고 나머지 1101, 11 1010 은 16 진법 으로 0 xd, 0 x3a (0 x3a 에 대응 하 는 문 자 는:) 로 환산 된다.
C 언어 표준 은 비트 필드 의 너비 가 의존 하 는 데이터 형식의 길 이 를 초과 해 서 는 안 된다 고 규정 하고 있다.쉽게 말 하면 구성원 변 수 는 모두 유형 이 있 는데 이 유형 은 구성원 변수의 최대 길 이 를 제한 합 니 다. 뒤의 숫자 는 이 길 이 를 초과 할 수 없습니다.
예 를 들 어 위의 bs, n 의 유형 은 unsigned int 이 고 길 이 는 4 개의 바이트 이 며 모두 32 비트 이다. 그러면 n 뒤의 숫자 는 32 를 초과 할 수 없다.ch 의 유형 은 unsigned char 이 고 길 이 는 1 바이트 이 며 모두 8 자리 입 니 다. 그러면 ch 뒤의 숫자 는 8 을 초과 할 수 없습니다.
비트 필드 기술 은 구성원 변수 가 사용 하 는 메모리 에서 일부 비트 폭 을 선택 하여 데 이 터 를 저장 하 는 것 이 라 고 볼 수 있 습 니 다.
C 언어 표준 은 제 한 된 몇 가지 데이터 형식 만 비트 필드 에 사용 할 수 있다 고 규정 했다.ANSI C 에서 이 몇 가지 데이터 형식 은 int, signed int 와 unsigned int (int 기본 값 은 signed int) 입 니 다.C99 가 되면,불 도 지 지 를 받 았 다.
그러나 컴 파일 러 는 구체 적 으로 실 현 될 때 확장 되 었 고 char, signed char, unsigned char 와 enum 형식 을 추가 로 지원 하기 때문에 위의 코드 는 C 언어 표준 에 부합 되 지 않 지만 컴 파일 러 에 의 해 지원 된다.
비트 필드 의 저장 소
C 언어 표준 은 비트 필드 의 구체 적 인 저장 방식 을 규정 하지 않 았 고 서로 다른 컴 파일 러 는 서로 다른 실현 이 있 지만 모두 저장 공간 을 최대한 압축 했다.
비트 필드 의 구체 적 인 저장 규칙 은 다음 과 같 습 니 다.
4. 567917. 인접 한 구성원 의 유형 과 동시에 그들의 위치 가 넓 고 유형의 size of 크기 보다 작 으 면 뒤의 구성원 은 앞의 구성원 과 인접 하여 수용 할 수 없 을 때 까지 저장 합 니 다.만약 에 이들 의 위치 가 넓 고 유형의 size of 크기 보다 크다 면 뒤의 구성원 들 은 새로운 저장 장치 부터 시작 하여 오프셋 은 유형 크기 의 정수 배 입 니 다
아래 비트 필드 bs 를 예 로 들 면:
    #include 
    int main(){
        struct bs{
            unsigned m: 6;
            unsigned n: 12;
            unsigned p: 4;
        };
        printf("%d
", sizeof(struct bs)); return 0; } : 4

m, n, p 의 유형 은 모두 unsigned int 이 고 sizeof 의 결 과 는 4 개의 바이트 (Byte), 즉 32 개의 비트 (Bit) 이다.m, n, p 의 위치 너비 의 합 은 6 + 12 + 4 = 22 로 32 보다 작 기 때문에 그들 은 붙 어 저장 되 고 중간 에 틈 이 없다.
sizeof(struct bs)         4,    3,           4    ,        ,   《C      》   《C      ,      》       。

멤버 m 의 비트 폭 을 22 로 바 꾸 면 출력 결 과 는 8 이 될 것 입 니 다. 22 + 12 = 34 로 32 보다 크 면 n 은 새로운 위치 에서 저장 되 고 m 의 오프셋 은 size of (unsigned int), 즉 4 바이트 입 니 다.
멤버 p 의 너비 도 22 로 바 꾸 면 출력 결 과 는 12 이 고 세 멤버 모두 저장 되 지 않 습 니 다.
4. 567917. 인접 한 구성원 의 유형 이 다 르 면 서로 다른 컴 파일 러 는 서로 다른 실현 방안 이 있 고 GCC 는 압축 저장 소 를 가지 지만 VC / VS 는 그렇지 않다
아래 필드 bs 를 보십시오:
#include 
int main(){
    struct bs{
        unsigned m: 12;
        unsigned char ch: 4;
        unsigned p: 4;
    };
    printf("%d
", sizeof(struct bs)); return 0; }

GCC 에서 의 운행 결 과 는 4, 3 명의 구성원 이 붙 어 저장 되 었 다.VC / VS 에서 의 실행 결 과 는 12 이 고 세 구성원 은 각자 의 유형 에 따라 저장 합 니 다 (위치 가 넓 을 때 를 가리 키 지 않 는 저장 방식 과 같 습 니 다).
m 、ch、p        4、1、4    ,     9      ,     VC/VS          12  ?C      ,      。

4. 567917. 멤버 간 에 비 비트 도 메 인 멤버 가 삽입 되 어 있 으 면 압축 하지 않 습 니 다.예 를 들 어 아래 bs: struct bs {unsigned m: 12; unsigned ch; unsigned p: 4;};
각 컴 파일 러 에서 sizeof 의 결 과 는 모두 12 이다.
위의 분석 을 통 해 우 리 는 비트 도 메 인 구성원 들 이 완전한 바이트 를 차지 하지 않 고 가끔 은 바이트 의 시작 위치 에 있 지 않 기 때문에 비트 도 메 인 구성원 의 주 소 를 사용 하고 얻 는 것 은 의미 가 없고 C 언어 도 이렇게 하 는 것 을 금지한다.주 소 는 비트 (Bit) 가 아 닌 바이트 (Byte) 의 번호 입 니 다.
이름 없 는 비트 필드
비트 도 메 인 구성원 은 이름 없 이 데이터 형식 과 너비 만 제시 할 수 있 습 니 다. 다음 과 같 습 니 다.
struct bs{
    int m: 12;
    int  : 20;  //         
    int n: 4;
};

무명 비트 필드 는 일반적으로 구성원 의 위 치 를 채 우거 나 조정 하 는 데 쓰 인 다.이름 이 없 기 때문에 이름 없 는 비트 도 메 인 을 사용 할 수 없습니다.
위의 예 에서 너비 가 20 인 무명 멤버 가 없 으 면 m, n 은 저장 소 에 붙 고 size of (struct bs) 의 결 과 는 4 이다.이 20 비트 를 채 우 면 m, n 은 각각 저장 되 고 sizeof (struct bs) 의 결 과 는 8 입 니 다.

좋은 웹페이지 즐겨찾기