[질문] C언 질문: 구조체 안에서 콜론의 역활
글쓴이: naisr00t / 작성시간: 목, 2005/01/13 - 10:47오전
리눅스에서의 소스는 아닙니다.
RTOS 분석 중에
처음 보는 구문이라서 질문을 드립니다.
대략 코드 템플릿만 따오면 다음과 같습니다.
1
2
3
4 struct test {
5 int t:4;
6 };
7
8 int main(void)
9 {
10 struct test ss;
11
12 printf("Before test value = %d\n", ss.t);
13 ss.t = 2;
14 printf("After test value = %d\n", ss.t);
15 return 0;
16 }
실행 보면 첫 번째 값은 0이고, 두번 째값은 2 입니다.
질문은 구조체 안에 즉, 5번째 줄의 구문입니다.
실제 소스가 저렇게 되어 있습니다.
int t:4;: [콜론]의 의미는 무엇일까요?
그리고 표준 문법인가요?
일반 컴파일러도 지원 하는지요?
테스트할 때는 gcc로 했습니다.
Forums:


비트 필드
비트 필드입니다.
비트 필드가 사용되는 주된 이유는 메모리 절약에 있습니다.
젊음의 도전은 때로는 무모해야한다.
Re: 비트 필드는 뭐죠?
좀 더 자세히 부탁드려요?
비트필드
보통 unsigned 형을 사용하지만 int형을 사용하는경우는 최상위 비트를 부호비트로 쓰기위해서 사용이 됩니다.
여기서 t는 4비트만을 가지게 됩니다.
이소스로 확인해보시면서 하시면 이해가 가실겁니다.
#include <stdio.h> 19 #include<limits.h> 20 struct test { 21 int t:10; 22 }; 23 void bit_print(int a) 24 { 25 int i; 26 int n=sizeof(int)* CHAR_BIT; 27 int mask=1<<(n-1); 28 for(i=1;i<=n;++i) 29 { 30 putchar(((a & mask)==0)?'0':'1'); 31 a<<=1; 32 if(i%CHAR_BIT==0 && i <n) 33 putchar(' '); 34 } 35 } 36 int main(void) 37 { 38 struct test ss; 39 printf("%d\n",sizeof(ss)); 40 printf("Before test value = %d\n", ss.t); 41 bit_print(ss.t); 42 puts("\n"); 43 ss.t = 10; 44 bit_print(ss.t); 45 puts("\n"); 46 //printf("After test value = %d\n", ss.t); 47 return 0; 48 } 49젊음의 도전은 때로는 무모해야한다.
Re: 비트 필드
메모리 절약을 위해서 쓰기도 하지만... 하드웨어 레지스터 제어를 위해서 더 많이 쓰이는걸로 압니다...
하드웨어레지스터가 보통 32비트에서 어떤비트는 어떤용도로 쓰고... 또 어떤 비트는 어떤 용도로 쓰고... 비트별로 용도가 나누어져 있어서 위와같이 많이 씁니다...
만약 RTOS에서 저런 부분을 보셨다면... 아마도 하드웨어 레지스터나 network protocal이나... 그런 부분에 쓰였을 가능성이 높을 것 같습니다... :wink:
[code:1]#pragma pack(1)struc
#pragma pack(1) struct _ts_header { unsigned sync_byte : 8; unsigned transport_error_indicator : 1; unsigned payload_unit_start_indicator : 1; unsigned transport_priority : 1; unsigned PID :13; unsigned transport_scrambling_control : 2; unsigned adaptation_field_control : 2; unsigned continuity_counter : 4; }; #pragma pack()음... 이렇게들 많이 쓰더군요...
댓글 달기