C 언어의 비트 세그먼트
비트 필드는 구조체(또는 공용체)의 멤버 변수가 차지하는 공간을 비트 단위로 정의합니다. 비트 세그먼트를 포함하는 구조(결합)를 비트 세그먼트 구조라고 합니다. 분할된 구조는 공간을 절약하고 작업을 용이하게 할 수 있습니다.
비트 필드의 정의 형식은 다음과 같습니다.
type [var]: digits
여기서 유형은 int, unsigned int, signed만 가능합니다. int에는 세 가지 유형이 있습니다. int 유형이 음수를 나타낼 수 있는지 여부는 컴파일러에 따라 다릅니다. 예를 들어 VC의 int는 기본적으로 signed로 설정됩니다. int, 음수를 나타낼 수 있음) 비트 필드 이름 var는 선택적 매개변수이므로 생략할 수 있습니다. digits는 이 비트 필드가 차지하는 이진수 수를 나타냅니다.
그런 다음 비트 세그먼트 구조를 정의하면 다음 코드와 같이 정의할 수 있습니다.
struct node { unsigned int a:4; //位段a,占4位 unsigned int :0; //无名位段,占0位 unsigned int b:4; //位段b,占4位 int c:32; //位段c,占32位 int :6; //无名位段,占6位 };
1. 비트 세그먼트 사용
사용 시 몇 가지 주의할 점이 있습니다. 비트 세그먼트:
1) 비트 필드 유형은 int, unsigned int, signed int만 가능하며 char 유형 또는 부동 소수점 유형일 수 없습니다.
2) 다음이 차지하는 이진수; 비트 필드 숫자는 기본 유형으로 표현할 수 있는 최대 자릿수를 초과할 수 없습니다. 예를 들어 VC에서는 int가 4바이트를 차지하므로 최대 32비트만 가능합니다. 이름이 없는 비트 세그먼트는 액세스할 수 없지만 공간을 차지합니다.
4) 비트 필드에서는 주소 작업을 수행할 수 없습니다. 5) 비트 필드가 차지하는 이진수 개수가 0인 경우 이 비트 필드는 무명 비트 필드여야 하며 다음 비트 필드는 다음 비트 필드 저장 단위(여기서 비트 필드 저장 단위 수)에 저장됩니다. VC 환경에서는 4로 테스트됨) Bytes)가 저장되기 시작합니다.
6) 비트 필드가 표현식에 나타나면 자동으로 정수 유형으로 업그레이드되고 int 유형 또는 unsigned로 변환됩니다. 정수.
7) 비트 세그먼트에 값을 할당할 때 비트 세그먼트가 나타낼 수 있는 최대 범위를 초과하지 않는 것이 가장 좋습니다. 그렇지 않으면 예상치 못한 결과가 발생할 수 있습니다.
8) 비트 필드는 배열 형태일 수 없습니다.
2. 비트 세그먼트 구조가 메모리에 저장되는 방식
비트 세그먼트 구조의 경우 컴파일러는 자동으로 저장 공간을 최적화합니다.
1) 비트 세그먼트 저장 단위가 하위 비트 세그먼트 구조의 모든 구성원을 저장할 수 있는 경우, 비트 세그먼트 구조의 모든 구성원은 하나의 비트 세그먼트 저장 단위에만 배치될 수 있으며 다음과 같은 경우 두 개의 비트 세그먼트 저장 단위에 배치될 수 없습니다. 하나의 비트 세그먼트 저장 단위는 하위 비트 세그먼트 구조의 모든 구성원을 수용할 수 없으며, 나머지 비트 세그먼트는 다음 비트 세그먼트 저장 단위부터 저장됩니다. (VC의 비트 세그먼트 저장 단위 크기는 4바이트입니다.)
2) 비트 세그먼트 구조에서 0비트를 차지하는 명명되지 않은 비트 세그먼트가 하나만 있으면 1 또는 0바이트의 공간만 차지합니다(C 언어에서는 0바이트, C++에서는 1바이트). 비트 세그먼트 구조가 차지하는 공간은 최소한 비트 세그먼트 저장 단위의 크기입니다.
테스트 프로그램:
실행 결과: 1 -1 -2 3/*测试位段 201110.12*/ #include<iostream> using namespace std; typedef struct node { unsigned int a:1; //存在一个非0位的位段,则至少占4Byte }S; typedef struct node1 //在C++中占1字节的空间 ,在C中占0字节 { unsigned int :0; }S1; typedef struct node2 { unsigned int a:1; unsigned int :0; //下一个位段放在一个新的位段存储单元 ,所以占4+4=8Byte unsigned c:32; }S2; typedef struct node3 { unsigned int a:4; unsigned int :0; int :6; //这个位段放在一个新的位段存储单元 unsigned c:32;//由于6+32>32,所位段c也放在一个新的位段存储单元,所以占4+4+4=12Byte }S3; typedef struct node4 { unsigned int a:1; char b; //在一个位段存储单元中能够存下所有的成员,所以占4Byte int c:1; int d:2; unsigned int e:2; }S4; nt main(int argc, char *argv[]) { S4 s4; s4.a=1; s4.c=1; s4.d=2; s4.e=3; printf("%d %d %d %d\n",s4.a,s4.c,s4.d,s4.e); printf("%d %d %d %d %d\n",sizeof(S),sizeof(S1),sizeof(S2),sizeof(S3),sizeof(S4)); return 0; }
계속하려면 아무 키나 누르십시오.
s4의 각 비트 필드를 인쇄할 때 인쇄된 결과가 지정된 초기 값과 다릅니다.
c는 1비트만 차지하므로 데이터 비트가 없으므로 상위 비트에 직접 1을 더하는 부호 확장을 수행하므로 출력되는 결과는 -1입니다. d는 2비트를 차지하므로 d에 2를 할당하면 메모리에 저장되는 내용은 10이 된다. 이때 부호 확장을 수행하여 상위 비트에 1을 추가하면 0XFF FF FF FE가 되고, 실제 값은 -2입니다.
읽어주셔서 감사합니다. 모든 사람에게 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!