C 언어 구조 체 -- 비트 필드

5157 단어
일부 데 이 터 는 저장 할 때 완전한 바이트 하 나 를 차지 하지 않 고 하나 또는 몇 개의 바 이 너 리 만 차지 하면 된다.예 를 들 어 스위치 는 전기 와 단전 두 가지 상태 만 있 고 0 과 1 로 충분 하 다 는 것 을 나타 낸다. 즉, 2 진 을 사용 하 는 것 이다.바로 이러한 고려 를 바탕 으로 C 언어 는 비트 필드 라 는 데이터 구 조 를 제공 했다.구조 체 가 정 의 될 때 우 리 는 특정한 구성원 변수 가 차지 하 는 바 이 너 리 자릿수 (Bit) 를 지정 할 수 있 습 니 다. 이것 이 바로 비트 필드 입 니 다.
eg:
  • struct test{
  • unsigned m;
  • unsigned n: 4;
  • unsigned char ch: 6;
  • }
  • : 뒤의 숫자 는 구성원 변수 가 차지 하 는 자릿수 를 제한 하 는 데 쓰 인 다.멤버 m 는 제한 이 없 으 며 데이터 형식 에 따라 4 바이트 (Byte) 의 메모 리 를 차지 하 는 것 으로 추정 된다.구성원 n, ch 는 : 뒤의 숫자 에 의 해 제한 되 어 데이터 형식 에 따라 길 이 를 계산 할 수 없습니다. 각각 4, 6 비트 (Bit) 의 메모 리 를 차지 합 니 다.n. ch 의 수치 범위 가 매우 제한 되 어 있 고 데이터 가 조금 만 크 면 넘 칠 수 있 습 니 다.
    eg:
  • #include
  • int main(){
  • struct test{
  • unsigned m;
  • unsigned n: 4;
  • unsigned char ch: 6;
  • } a = { 0xad, 0xE, '$'};
  • / / 1 차 수출
  • 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) 이 고 2 진법 으로 환산 하면 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 언어 표준 은 비트 필드 의 너비 가 의존 하 는 데이터 형식의 길 이 를 초과 해 서 는 안 된다 고 규정 하고 있다.쉽게 말 하면 구성원 변 수 는 모두 유형 이 있 는데 이 유형 은 구성원 변수의 최대 길 이 를 제한 하고 : 뒤의 숫자 는 이 길 이 를 초과 할 수 없다.예 를 들 어 위의 test, 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 언어 표준 은 비트 필드 의 구체 적 인 저장 방식 을 규정 하지 않 았 고 서로 다른 컴 파일 러 는 서로 다른 방법 으로 이 루어 졌 으 나 모두 비트 필드 저장 공간 을 최대한 압축 했다.비트 필드 의 구체 적 인 저장 규칙 은 다음 과 같다. 1) 인접 한 구성원 의 유형 과 동시에 그들의 위치 가 넓 고 유형의 size of 크기 보다 작 으 면 뒤의 구성원 은 앞의 구성원 과 인접 하여 수용 할 수 없 을 때 까지 저장 합 니 다.만약 에 이들 의 위치 가 넓 고 유형의 size of 크기 보다 크다 면 뒤의 구성원 들 은 새로운 저장 장치 부터 시작 하여 오프셋 은 유형 크기 의 정수 배 입 니 다.아래 위치 로 test 예:
  • #include
  • int main(){
  • struct test{
  • unsigned m: 6;
  • unsigned n: 12;
  • unsigned p: 4;
  • };
  • printf("%d", sizeof(struct test));
  • return 0;
  • }

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

  • GCC 에서 의 운행 결 과 는 4, 3 명의 구성원 이 붙 어 저장 되 었 다.VC / VS 에서 의 실행 결 과 는 12 이 고 세 구성원 은 각자 의 유형 에 따라 저장 합 니 다 (위치 가 넓 을 때 를 가리 키 지 않 는 저장 방식 과 같 습 니 다).
    3) 멤버 간 에 비 비트 도 메 인 멤버 가 삽입 되 어 있 으 면 압축 하지 않 는 다.
    eg:
  • struct test{
  • unsigned m: 12;
  • unsigned ch;
  • unsigned p: 4;
  • };

  • 각 컴 파일 러 에서 sizeof 의 결 과 는 모두 12 이다.위의 분석 을 통 해 우 리 는 비트 도 메 인 구성원 들 이 완전한 바이트 를 차지 하지 않 고 가끔 은 바이트 의 시작 위치 에 있 지 않 기 때문에 & 을 사용 하여 비트 도 메 인 구성원 의 주 소 를 얻 는 것 은 의미 가 없고 C 언어 도 이렇게 하 는 것 을 금지한다.주 소 는 바이트 의 번호 이지 위치의 번호 가 아니다.
    이름 없 는 비트 필드
    비트 도 메 인 구성원 은 이름 없 이 데이터 형식 과 너비 만 제시 할 수 있 습 니 다. 다음 과 같 습 니 다.
  • struct test{
  • int m: 12;
  • int: 20; / 이 도 메 인 구성원 은 사용 할 수 없습니다
  • int n: 4;
  • };

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

    좋은 웹페이지 즐겨찾기