C 언어 구조 체 -- 비트 필드
eg:
:
뒤의 숫자 는 구성원 변수 가 차지 하 는 자릿수 를 제한 하 는 데 쓰 인 다.멤버 m 는 제한 이 없 으 며 데이터 형식 에 따라 4 바이트 (Byte) 의 메모 리 를 차지 하 는 것 으로 추정 된다.구성원 n, ch 는 :
뒤의 숫자 에 의 해 제한 되 어 데이터 형식 에 따라 길 이 를 계산 할 수 없습니다. 각각 4, 6 비트 (Bit) 의 메모 리 를 차지 합 니 다.n. ch 의 수치 범위 가 매우 제한 되 어 있 고 데이터 가 조금 만 크 면 넘 칠 수 있 습 니 다.eg:
실행 결과: 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 예:
실행 결과: 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 를 보십시오:
GCC 에서 의 운행 결 과 는 4, 3 명의 구성원 이 붙 어 저장 되 었 다.VC / VS 에서 의 실행 결 과 는 12 이 고 세 구성원 은 각자 의 유형 에 따라 저장 합 니 다 (위치 가 넓 을 때 를 가리 키 지 않 는 저장 방식 과 같 습 니 다).
3) 멤버 간 에 비 비트 도 메 인 멤버 가 삽입 되 어 있 으 면 압축 하지 않 는 다.
eg:
각 컴 파일 러 에서 sizeof 의 결 과 는 모두 12 이다.위의 분석 을 통 해 우 리 는 비트 도 메 인 구성원 들 이 완전한 바이트 를 차지 하지 않 고 가끔 은 바이트 의 시작 위치 에 있 지 않 기 때문에
&
을 사용 하여 비트 도 메 인 구성원 의 주 소 를 얻 는 것 은 의미 가 없고 C 언어 도 이렇게 하 는 것 을 금지한다.주 소 는 바이트 의 번호 이지 위치의 번호 가 아니다.이름 없 는 비트 필드
비트 도 메 인 구성원 은 이름 없 이 데이터 형식 과 너비 만 제시 할 수 있 습 니 다. 다음 과 같 습 니 다.
무명 비트 필드 는 일반적으로 구성원 의 위 치 를 채 우거 나 조정 하 는 데 쓰 인 다.이름 이 없 기 때문에 이름 없 는 비트 도 메 인 을 사용 할 수 없습니다.위의 예 에서 너비 가 20 인 무명 멤버 가 없 으 면 m, n 은 저장 소 에 붙 고 size of (struct bs) 의 결 과 는 4 이다.이 20 비트 를 채 우 면 m, n 은 각각 저장 되 고 sizeof (struct bs) 의 결 과 는 8 입 니 다.
다음으로 전송:https://www.cnblogs.com/zhangjiansheng/p/6527619.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.