c - 초기화 - 비트필드 필요성




제로 너비 비트 필드 란 무엇입니까 (3)

메모리 레이아웃은 "의존적"이며 특정 컴파일러의 특정 레이아웃에 의존 할 수 없습니다. 사실, 설정을 변경하여 주어진 컴파일러와 다른 레이아웃을 볼 수 있습니다. 짐작하거나, intuit하거나, 레이아웃에 의존하려고하지 마십시오.

네거티브 - 모든 요소는 서명 된 int 이므로 모든 비트를 1로 초기화 했으므로 음수입니다. 따라서 부호 비트가 설정되어 있습니다. d - beats에 관해서는. 오식?

가능한 중복 :
0 길이 비트 필드의 실제 사용

왜 어떤 구조체가 너비가 0 인 비트 필드를 갖고 있으며 왜 필요합니까?

struct foo {
  int    a:3;
  int    b:2;
  int     :0; // Force alignment to next boundary.
  int    c:4;
  int    d:3;
};

int main()
{
        int i = 0xFFFF;
        struct foo *f = (struct foo *)&i;
        printf("a=%d\nb=%d\nc=%d\nd=%d\n", f->a, f->b, f->c, f->d);
        return 0;
}

위의 프로그램의 출력은 다음과 같습니다.

[email protected]-team:~/programs/test$ ./a.out
a=-1
b=-1
c=-8
d=0

이 값이 왜 부정적이며 왜 구조 내부의 이러한 변수의 메모리 레이아웃을 설명해 주시겠습니까?


비트 필드가 서명 되었기 때문에 숫자가 음수입니다. 즉, signed char 변수가있는 경우 크기는 8 비트로 256 가지 값을 가질 수 있습니다. 값의 절반은 양수이고 나머지는 음수 및 0입니다. 최상위 비트는 부호 (음수는 1, 양수는 0)를 나타냅니다. 길이가 0 인 비트 필드에 대해서는 다음을 참조하십시오. 0 길이 비트 필드의 실제 사용


here 에 언급 된 것처럼 길이가 0 인 비트 필드는 비트 필드간에 정렬을 추가합니다. 행에 여러 비트 필드가있는 경우 레이아웃은 작지만 바이트 / 단어 / 워드 경계에 둘 중 하나를 정렬하려면이 위치와 이전 위치 사이에 길이가 0 인 비트 필드를 배치해야합니다.

위 링크의 예 :

struct on_off {
                  unsigned light : 1;
                  unsigned toaster : 1;
                  int count;            /* 4 bytes */
                  unsigned ac : 4;     // this and
                  unsigned : 4;        // this and
                  unsigned clock : 1;  // this bitfields are next to each other
                  unsigned : 0;
                  unsigned flag : 1;   // this bitfield is at a 4 bytes boundary.
                 } kitchen ;






signed