c 구조 체 중의 비트 필드

일부 정 보 는 저장 할 때 완전한 바 이 트 를 차지 하지 않 고 몇 개 또는 한 개의 바 이 너 리 만 차지 해 야 한다.예 를 들 어 하나의 스위치 량 을 저장 할 때 0 과 1 두 가지 상태 만 있 고 1 비트 2 진 으로 하면 된다.저장 공간 을 절약 하고 처 리 를 간편 하 게 하기 위해 C 언어 는 '비트 필드' 또는 '비트 세그먼트' 라 는 데이터 구 조 를 제공 했다.이른바 '비트 필드' 는 한 바이트 의 이 진 위 를 몇 개의 서로 다른 구역 으로 나 누고 각 구역 의 위 치 를 설명 하 는 것 이다.도 메 인 마다 도 메 인 이름 이 있 습 니 다. 프로그램 에서 도 메 인 이름 에 따라 작업 할 수 있 습 니 다.이렇게 하면 몇 개의 서로 다른 대상 을 한 바이트 의 바 이 너 리 필드 로 표시 할 수 있다.
1. 비트 필드 의 정의 와 비트 필드 변수의 설명 비트 도 메 인 정 의 는 구조 정의 와 비슷 합 니 다. 그 형식 은
struct       
{
     
};
그 중에서 비트 도 메 인 목록 의 형식 은 유형 설명자 비트 도 메 인 이름: 비트 도 메 인 길이 비트 도 메 인 변수의 설명 과 구조 변수 설명 방식 이 같 습 니 다.먼저 정 의 를 내 린 후에 설명 하 는 동시에 이 세 가지 방식 을 정의 하거나 직접 설명 할 수 있다.예 를 들 면: 
struct bs
{
  int a:8;
  int b:2;
  int c:6;
}data; 
데 이 터 는 bs 변수 로 모두 두 개의 바이트 를 차지한다.그 중에서 비트 도 메 인 a 는 8 위 를 차지 하고 비트 도 메 인 b 는 2 위 를 차지 하 며 비트 도 메 인 c 는 6 위 를 차지한다.비트 필드 에 대한 정 의 는 다음 과 같은 몇 가지 설명 이 있 습 니 다. 1. 한 비트 필드 는 같은 바이트 에 저장 해 야 하 며 두 바이트 에 걸 쳐 서 는 안 됩 니 다.한 바이트 에 남 은 공간 이 다른 도 메 인 을 저장 하지 못 할 경우 다음 단원 부터 이 도 메 인 을 저장 해 야 합 니 다.어떤 도 메 인 을 다음 단원 에서 시작 할 수도 있 습 니 다.예 를 들 면:
struct bs
{
    unsigned a:4
    unsigned b:5 /*         */
    unsigned c:4
}

2. 비트 필드 는 두 개의 바이트 를 넘 을 수 없 기 때문에 비트 필드 의 길 이 는 한 바이트 의 길이 보다 크 면 안 됩 니 다.3. 비트 도 메 인 은 도 메 인 이름 이 없 을 수 있 습 니 다. 이 때 는 채 우거 나 위 치 를 조정 하 는 데 만 사 용 됩 니 다.이름 없 는 비트 필드 는 사용 할 수 없습니다.예 를 들 면:
struct k
{
    int a:1
    int :2 /*    , 2     */
    int b:3
    int c:2
};

다음 예 는 한 회사 (화이트 칼라 과학기술 - 청도) 의 필기시험 에 참가 하여 만 났 는데 그 때 잘못 을 했 습 니 다. 잊 어 버 릴 까 봐 빨리 쓰 세 요.
#include <iostream>
 #include <memory.h>
 using namespace std;
 struct A
 {
     int a:5;
     int b:3;
 };
 int main(void)
 {
     char str[100] = "0134324324afsadfsdlfjlsdjfl";
         struct A d;
     memcpy(&d, str, sizeof(A));
     cout << d.a << endl;
     cout << d.b << endl;
     return 0;
 }

32 비트 x86 기계 에서 출력: - 16 1 해석: 기본 적 인 상황 에서 구조 체 내 요소 에 대한 접근 과 관 리 를 편리 하 게 하기 위해 구조 체 내 요소 의 길이 가 프로세서 의 자릿수 보다 작 을 때 구조 체 내 에서 가장 긴 요 소 를 그 단위 로 한다. 즉, 구조 체 의 길 이 는 반드시 가장 긴 데이터 요소 의 정수 배 이다.프로세서 의 자릿수 보다 구조 체 메모리 길이 가 큰 요소 가 있다 면 프로세서 의 자릿수 를 정렬 단위 로 합 니 다.32 비트 프로세서 이 고 구조 체 의 a 와 b 요소 유형 은 모두 int (4 바이트) 이기 때문에 구조 체 의 A 점용 메모리 가 4 바이트 입 니 다.상기 프로그램 에서 비트 도 메 인 구조 A 를 정 의 했 고 두 개의 비트 도 메 인 은 a (5 자리 차지), b (3 자리 차지) 로 정의 되 었 기 때문에 a 와 b 는 모두 구조 A 하나의 바이트 (낮은 바이트) 를 차지 했다.프로그램 이 14 줄 까지 실 행 될 때 d 메모리 할당 상황: 고위 00110100 00110011   00110001    00110000 하위       '4'           '3'             '1'              '0'  그 중에서 d. a 와 d. b 는 d 낮은 바이트 (00110000), d. a: 10000, d. b: 001 을 차지한다.
d. a 메모리 의 바 이 너 리 는 10000 임 을 나타 낸다. d. a 는 기호 가 있 는 정형 변수 이기 때문에 출력 할 때 기호 위 치 를 확장 해 야 하기 때문에 결 과 는 - 16 (바 이 너 리 는 11111111111111111111111111111111111110000) d. b 메모리 의 바 이 너 리 는 001 임 을 나타 낸다. d. b 는 기호 가 있 는 정형 변 량 이기 때문에 출력 할 때 기호 위 치 를 확장 해 야 하기 때문에 결 과 는 1 이다.(바 이 너 리 는 00000000000000000000000000000000001)
3. 비트 필드 의 정렬 구조 체 에 비트 필드 (bit - field) 가 있 으 면그러면 VC 의 준칙 은 다음 과 같다. 1) 인접 도 메 인 필드 의 유형 이 같 고 그 너비 가 유형의 size of 크기 보다 작 으 면 뒤의 필드 는 수용 할 수 없 을 때 까지 앞의 필드 에 인접 하여 저장 된다. 2) 인접 도 메 인 필드 의 유형 이 같 지만 그 너비 와 유형의 size of 크기 보다 크 면 뒤의 필드 는 새로운 저장 장치 에서 열 린 다.처음에 그 오프셋 은 그 유형 크기 의 정수 배 이다. 3) 인접 한 비트 필드 의 유형 이 다 르 면 각 컴 파일 러 의 구체 적 인 실현 에 차이 가 있 고 VC6 는 압축 되 지 않 는 방식 (서로 다른 비트 필드 는 서로 다른 비트 필드 유형 바이트 에 저장) 을 취한 다.Dev - C + + 와 GCC 는 모두 압축 방식 을 취하 고 시스템 은 먼저 구조 체 구성원 에 게 정렬 방식 에 따라 공간 과 채 우기 (padding) 를 분배 한 다음 에 변 수 를 비트 필드 로 조작 합 니 다.
원문:http://www.cnblogs.com/bigrabbit/archive/2012/09/20/2695543.html

좋은 웹페이지 즐겨찾기