*비트 필드의 계념*
C에서 정수형 멤버를 사용하기에는 너무 작은 법위의 값을 가질 경우, 이를 일정한 비트 수만큼 할당하여 표현 할 수 있다. 비트 필드는 C의 구조체나 공용체에서 하나 이상의 비트들로 구성된 int형이나 unsigned int형 멤버이다.
type member_name : size 위와 같이 형식을 따라고 type은 int 또는 unsinned int로 한정되고, singed 비트 필드를 명시하면 최상위 한 비트는 부호 비트로 취급된다. size는 비트 필드에서 제시된 비트 수를 말하며, 폭(width)이라 한다. 이는 콜론(:) 다음 음수가 아닌 정수형 상수식으로 지정되며, 폭의 최대크기는 기계 워드의 비트 수(PC 32bit, 28 DSP 16bit)와 같다.
비트 필드를 사용할 경우, 사용 시에 다음과 같은 제한 사항을 고려해야한다.
*워드의 경계*
대부분의 컴파일러는 비트 필드가 워드 경계에 걸치지 않도록 할당한다. 즉 28계열 DSP에서 비트 필드로 지정되어진 비트 수를 전부 더해도 16비 이내라면, 하나의 int 영역에 기록하게 된다. 그러나 24비트라면, 처음 16비트는 int 영역에 기억되고 나머지 8비트는 그 다음 int 영역에 기억된다. 이와 같이 16비트를 초과하는 경우는 워더 경계에 맞추며, 이는 C 컴파일러가 자동적으로 처리한다.
C에서는 이러한 워드 경계 지정을 비트 폭이 0인 이름 없는 특별한 멤버를 사용하여 프로그래머가 할 수 있도록 해 준다.
예)
struct bit {
unsigned int bit_0 : 1; //최초의 int 영역에 기억
unsigned int bit_1 : 1; //최초의 int 영역에 기억
unsigned : 0; //강제적으로 워드 경계 조정
unsigned int bit_3 : 1; //다음의 int 영역에 기억
unsigned int bit_4 : 1; //다음의 int 영역에 기억
};
*비트의 채움*
size가 0이 아니면서 member_name이 없는 무명 비트 필드는 입력 필드 사이에 패딩(비트의 비움)을 위해서 제공된다. 즉, 필드명이 생략된 경우는 그 비트 길이만큼 패딩을 하며, 이부분은 필드명이 없으므로 참조할 수 없다.
예)1바이트 이내에서 값을 가지는 필드의 비트 위치를 지정
struct bit {
unsigned : 1; //1비트 채워 넣음
unsigned int bit_1 : 1;
unsigned int bit_2 : 1;
unsigned
unsigned : 3; //3비트 채워 넣음
unsigned int bit_6 : 1;
unsigned int bit_7 : 1;
};
비트 번호 : 7 6 5 4 3 2 1 0
사용 여부 : O O X X X O O X
C에서 정수형 멤버를 사용하기에는 너무 작은 법위의 값을 가질 경우, 이를 일정한 비트 수만큼 할당하여 표현 할 수 있다. 비트 필드는 C의 구조체나 공용체에서 하나 이상의 비트들로 구성된 int형이나 unsigned int형 멤버이다.
비트 필드를 사용할 경우, 사용 시에 다음과 같은 제한 사항을 고려해야한다.
① int형 및 unsigned int 형의 변수만 정의 가능하다.
② 비트 필드에 배열은 허용되지 않는다.
③ 비트 필드는 번지를 가질 수 없다. 따라서 & 연사자 또한 사용할 수 없다. 이것은 멤버->가 사용될 수 있다 하더라도 포인터는 직접 비트 필드를 포인터 할 수 없음을 의미한다.
예)
int *x, y;
struct{
int a : 3;
unsinged int b : 1;
}z, *p;
z = &z.b; //에러
y = p->a; //에러
④ 비트 필드를 반환하는 함수는 허용되지 않는다.
⑤ 구조체 멤버 내에 다를 형의 멤버가 혼재하는 경우는 사용하지 않는 비트가 생길 수 있다.
② 비트 필드에 배열은 허용되지 않는다.
③ 비트 필드는 번지를 가질 수 없다. 따라서 & 연사자 또한 사용할 수 없다. 이것은 멤버->가 사용될 수 있다 하더라도 포인터는 직접 비트 필드를 포인터 할 수 없음을 의미한다.
예)
int *x, y;
struct{
int a : 3;
unsinged int b : 1;
}z, *p;
z = &z.b; //에러
y = p->a; //에러
④ 비트 필드를 반환하는 함수는 허용되지 않는다.
⑤ 구조체 멤버 내에 다를 형의 멤버가 혼재하는 경우는 사용하지 않는 비트가 생길 수 있다.
*워드의 경계*
대부분의 컴파일러는 비트 필드가 워드 경계에 걸치지 않도록 할당한다. 즉 28계열 DSP에서 비트 필드로 지정되어진 비트 수를 전부 더해도 16비 이내라면, 하나의 int 영역에 기록하게 된다. 그러나 24비트라면, 처음 16비트는 int 영역에 기억되고 나머지 8비트는 그 다음 int 영역에 기억된다. 이와 같이 16비트를 초과하는 경우는 워더 경계에 맞추며, 이는 C 컴파일러가 자동적으로 처리한다.
C에서는 이러한 워드 경계 지정을 비트 폭이 0인 이름 없는 특별한 멤버를 사용하여 프로그래머가 할 수 있도록 해 준다.
예)
struct bit {
unsigned int bit_0 : 1; //최초의 int 영역에 기억
unsigned int bit_1 : 1; //최초의 int 영역에 기억
unsigned : 0; //강제적으로 워드 경계 조정
unsigned int bit_3 : 1; //다음의 int 영역에 기억
unsigned int bit_4 : 1; //다음의 int 영역에 기억
};
*비트의 채움*
size가 0이 아니면서 member_name이 없는 무명 비트 필드는 입력 필드 사이에 패딩(비트의 비움)을 위해서 제공된다. 즉, 필드명이 생략된 경우는 그 비트 길이만큼 패딩을 하며, 이부분은 필드명이 없으므로 참조할 수 없다.
예)1바이트 이내에서 값을 가지는 필드의 비트 위치를 지정
struct bit {
unsigned : 1; //1비트 채워 넣음
unsigned int bit_1 : 1;
unsigned int bit_2 : 1;
unsigned
unsigned : 3; //3비트 채워 넣음
unsigned int bit_6 : 1;
unsigned int bit_7 : 1;
};
비트 번호 : 7 6 5 4 3 2 1 0
사용 여부 : O O X X X O O X
'[ Programing ] > C++' 카테고리의 다른 글
커스텀 날짜 관련 구조체 (0) | 2013.05.22 |
---|---|
memset 메모리 초기화시 0과 0x00 차이. 그리고 그외 초기값 문제점 (0) | 2013.05.22 |
템플릿 클래스(Template Class)에서 멤버 로 iterator 가지기 (0) | 2013.05.22 |
[코딩 팁]조건문에서 상수를 앞에 두기 (0) | 2013.05.22 |
RTTI, dynamic_cast (0) | 2013.05.22 |