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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.