[질문] C언 질문: 구조체 안에서 콜론의 역활

naisr00t의 이미지

리눅스에서의 소스는 아닙니다.
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로 했습니다.
embster의 이미지

비트 필드입니다.
비트 필드가 사용되는 주된 이유는 메모리 절약에 있습니다.

젊음의 도전은 때로는 무모해야한다.

naisr00t의 이미지

kingword wrote:
비트 필드입니다.
비트 필드가 사용되는 주된 이유는 메모리 절약에 있습니다.

좀 더 자세히 부탁드려요?

embster의 이미지

int t:4;

보통 unsigned 형을 사용하지만 int형을 사용하는경우는 최상위 비트를 부호비트로 쓰기위해서 사용이 됩니다.
여기서 t는 4비트만을 가지게 됩니다.

 ss.t = 2; 
0010 이런형태의 값을 가지게 됩니다.

이소스로 확인해보시면서 하시면 이해가 가실겁니다.

#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

젊음의 도전은 때로는 무모해야한다.

Hyun의 이미지

kingword wrote:
비트 필드입니다.
비트 필드가 사용되는 주된 이유는 메모리 절약에 있습니다.

메모리 절약을 위해서 쓰기도 하지만... 하드웨어 레지스터 제어를 위해서 더 많이 쓰이는걸로 압니다...
하드웨어레지스터가 보통 32비트에서 어떤비트는 어떤용도로 쓰고... 또 어떤 비트는 어떤 용도로 쓰고... 비트별로 용도가 나누어져 있어서 위와같이 많이 씁니다...
만약 RTOS에서 저런 부분을 보셨다면... 아마도 하드웨어 레지스터나 network protocal이나... 그런 부분에 쓰였을 가능성이 높을 것 같습니다... :wink:
Hyun의 이미지

#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()

음... 이렇게들 많이 쓰더군요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.