C 언어 비트 필드 (비트 세그먼트) 상세 설명
5203 단어 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 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.