2010-06-01 4 views
52

가능한 중복 :
What does this C++ code mean?구조체 또는 공용체 평균에서 '부호없는 임시 직원 : 3'은 무엇입니까?

내가 JNA를 사용하여 Java에 C 구조를 매핑하는 데 노력하고있어. 나는 내가 본 적이없는 무엇인가를 발견했다. 다음과 같이

struct 정의는 다음과 같습니다

struct op 
{ 
    unsigned op_type:9; //---> what does this mean? 
    unsigned op_opt:1; 
    unsigned op_latefree:1; 
    unsigned op_latefreed:1; 
    unsigned op_attached:1; 
    unsigned op_spare:3; 
    U8 op_flags; 
    U8 op_private; 
}; 

당신은 몇 가지 변수가 unsigned op_attached:1 같이 정의되고 내가 어떤 것을 의미 확실 해요 볼 수 있습니다. 이 특정 변수에 할당 할 바이트 수에 영향을 줍니까?

+1

와우, 저 역시 완전히 새로운 것입니다. 좋은 발견! –

+4

'콜론'이 추가되어 검색에 도움이됩니다. –

+0

비트 필드로 할 수있는 가장 좋은 방법은 비트 필드를 피하는 것입니다. 잘 정의 된 방식으로 정수 비트 단위로 액세스하는 마스킹 및 전환을 사용하는 것이 좋습니다. – starblue

답변

39

이 구조는 각 필드의 비트 길이를 지정합니다.

주의 할 점은 sizeof(op)을 제어 할 수 있다는 것입니다. 구조의 크기는 내부 필드의 크기의 합계가됩니다.

귀하의 경우 op 크기는 32 비트입니다 (즉, sizeof(op)은 4입니다).

크기는 부호없는 xxx : yy의 모든 그룹에 대해 항상 8의 배수로 반올림됩니다. 구성.

의미 :

struct A 
{ 
    unsigned a: 4; // 4 bits 
    unsigned b: 4; // +4 bits, same group, (4+4 is rounded to 8 bits) 
    unsigned char c; // +8 bits 
}; 
//     sizeof(A) = 2 (16 bits) 

struct B 
{ 
    unsigned a: 4; // 4 bits 
    unsigned b: 1; // +1 bit, same group, (4+1 is rounded to 8 bits) 
    unsigned char c; // +8 bits 
    unsigned d: 7; // + 7 bits 
}; 
//     sizeof(B) = 3 (4+1 rounded to 8 + 8 + 7 = 23, rounded to 24) 

내가 올바르게 기억 모르겠지만, 나는 바로 그것을 가지고 생각합니다.

+11

아이들을 기억하십시오! 비트 필드는 컴파일러에 따라 다르지만 위의 a : 4에서 처음 네 비트를 사용해야한다는 C/C++ 표준은 없습니다. –

+1

바이트 당 8 비트라고 가정합니다. – Ferruccio

+1

바이트 당 8 비트가 안전하다고 가정합니다. 컴파일러가 패딩 비트를 사용하지 않거나 하나의 특정 바이트 순서를 가지고 있다고 가정하면 그렇지 않습니다. – starturtle

19

이것은 bit field을 선언합니다. 콜론 다음의 숫자는 필드의 길이를 비트 단위로 나타냅니다 (즉, 그것을 나타내는 데 사용 된 비트 수).

4

정수 유형의 콜론 수정자는 int가 차지할 비트 수를 지정합니다.

6
unsigned op_type:9; 

의미 op_type은 9 비트의 정수 변수입니다.