애드센스본문상단

 


C언어 문법: Bit field (콜론 연산자)  - 리눅스/안드로이드

리눅스 커널 소스를 살펴보다가 스트럭쳐 안에 이상한 형식의 변수 선언을 보았다.

struct task_struct {
     ...
     unsigned did_exec:1;
     ...
};

이런 형태였는데, 변수를 선언한 다음 콜론(:)과 숫자가 오는 형태는 여지껏 본 적이 없었다.
구글링을 하여 찾아보니 bit field라는 이름의 C언어의 문법 중 하나라는 것을 알게 되었고
위키피디아에서 좀 더 자세한 글을 찾게 되어 번역해 보았다.

미리 이야기하자면 위의 구문은 did_exec라는 1bit짜리 변수를 선언한 것이다.

=======================================================================================
출처: http://en.wikipedia.org/wiki/C_syntax (Bit fields의 번역)

C언어는 bit field라고 알려진 특별한 형식의 스트럭쳐 멤버를 제공한다.
bit filed는 bit의 수를 명시한 integer 변수이다. bit filed는 signed int, unsigned int 혹은
_Bool의 스트럭쳐 멤버 형식과 멤버의 이름을 명시한 후 콜론을 쓰고 멤버 변수가 갖게 될 bit의 수를 적는다.
bit field의 총 bit 수는 명시된 형식의 최대 bit 수를 넘을 수 없다.

C언어 문법의 특별 예외 사항으로, sined 나 unsigned를 명시하지 않으면 정의된
int의 타입이 singed인지 unsigned인지 알 수 없다. 따라서 이식성(potability)을 위해 모든 스트럭쳐 멤버는
singed, unsigned를 명시하는 것을 권장한다.

콜론과 비트의 수로 이루어진 빈 bit field 엔트리도 허용하는데 이것은 padding을 의미한다.
bit field의 멤버는 주소를 갖지 않기 때문에 & 주소 연산자를 사용할 수 없다.
또한 bit field는 sizeof 연산자도 사용할 수 없다.

아래의 선언문은 f 타입으로 명명되고 g라는 인스턴스를 갖는 새로운 스트럭쳐를 정의한다.
각 멤버의 선언에 대해 간략히 주석을 달아놓았다.

struct f
{
    unsigned int  flag : 1;   -- bit flag: on(1) 또는 off(0)의 값을 가질 수 있다. --
    signed int    num : 4;   -- signed 4-bit field; -7...7 또는 -8...7의 값을 갖는다. (???) --
    : 3;                            -- 스트럭쳐를 8bit로 맞추기 위한 3bit의 padding bit --
} g;




덧글

  • 주노파파 2011/09/15 16:51 # 답글

    그렇군요! 좋은 정보 감사합니다 :)
  • 태효 2011/09/15 20:27 #

    C언어는 알아도 알아도 끝이 없는 것 같아요. ^^;
  • Hoons 2011/09/15 22:40 # 삭제 답글

    DSP 레지스터는 Bit field를 사용하고 있지요 ㅋ

    struct PCLKCR1_BITS { // bits description
    Uint16 EPWM1ENCLK:1; // 0 Enable SYSCLKOUT to EPWM1
    Uint16 EPWM2ENCLK:1; // 1 Enable SYSCLKOUT to EPWM2
    Uint16 EPWM3ENCLK:1; // 2 Enable SYSCLKOUT to EPWM3
    Uint16 EPWM4ENCLK:1; // 3 Enable SYSCLKOUT to EPWM4
    Uint16 EPWM5ENCLK:1; // 4 Enable SYSCLKOUT to EPWM5
    Uint16 EPWM6ENCLK:1; // 5 Enable SYSCLKOUT to EPWM6
    Uint16 rsvd1:2; // 7:6 reserved
    Uint16 ECAP1ENCLK:1; // 8 Enable SYSCLKOUT to ECAP1
    Uint16 ECAP2ENCLK:1; // 9 Enable SYSCLKOUT to ECAP2
    Uint16 ECAP3ENCLK:1; // 10 Enable SYSCLKOUT to ECAP3
    Uint16 ECAP4ENCLK:1; // 11 Enable SYSCLKOUT to ECAP4
    Uint16 ECAP5ENCLK:1; // 12 Enable SYSCLKOUT to ECAP5
    Uint16 ECAP6ENCLK:1; // 13 Enable SYSCLKOUT to ECAP6
    Uint16 EQEP1ENCLK:1; // 14 Enable SYSCLKOUT to EQEP1
    Uint16 EQEP2ENCLK:1; // 15 Enable SYSCLKOUT to EQEP2
    };

    union PCLKCR1_REG {
    Uint16 all;
    struct PCLKCR1_BITS bit;
    };
  • 태효 2011/09/15 23:19 #

    그래?? 왜 난 몰랐을까... ㅎㅎ
    좋은 정보 감사~~
  • 으어 2016/02/12 11:30 # 삭제 답글

    감사합니다!!
    윤성우님이 쓰신 c언어 책을 나름 열심히 봤다고 생각했는데,
    처음 보는 문법이많네요.....
    검색하기도 애매했는데, 어찌어찌 "구조체 변수 콜론"이라는 검색어를 떠올리기까지 1시간 ㅠ....
    잘 읽었습니다.
  • cialis 2016/09/06 22:47 # 삭제 답글

    Hello!
  • 궁금이 2016/10/06 10:44 # 삭제 답글

    감사합니다.
    잘 읽었습니다.
  • viagra 2018/10/04 13:05 # 삭제 답글

    Hello!
  • cheap_viagra 2018/10/05 15:23 # 삭제 답글

    Hello!
  • viagra_online 2018/10/08 17:15 # 삭제 답글

    Hello!
  • viagra_online 2018/10/13 08:58 # 삭제 답글

    Hello!
  • buy_viagra 2018/10/13 22:55 # 삭제 답글

    Hello!
  • cialis 2018/10/15 11:23 # 삭제 답글

    Hello!
  • buy_cialis 2018/10/19 03:31 # 삭제 답글

    Hello!
  • viagra_online 2018/10/21 01:22 # 삭제 답글

    Hello!
  • canadian_viagra 2018/10/21 16:17 # 삭제 답글

    Hello!
  • canadian_cialis 2018/10/26 20:48 # 삭제 답글

    Hello!
  • viagra 2018/10/29 19:18 # 삭제 답글

    Hello!
  • viagra_cheap 2018/10/31 19:03 # 삭제 답글

    Hello!
  • buy_viagra 2018/11/03 00:31 # 삭제 답글

    Hello!
  • super 2018/11/03 01:38 # 삭제 답글

    Hello!
  • online_viagra 2018/11/08 09:24 # 삭제 답글

    Hello!
  • Laila jan 2019/11/18 02:42 # 삭제 답글

    such creative work it's very graceful thanks to share unique ideas is very understanding for me
  • riya khan 2019/11/18 02:43 # 삭제 답글

    very awesome site i'm excited to see your next post this post such a ameze thanks
  • Maya G 2019/11/18 02:44 # 삭제 답글

    i am glad to saw your site is stunning all the work is unique and outstanding thanks
댓글 입력 영역


애드센스본문측면

통계 위젯 (화이트)

740
174
313561

Analytics