2010-06-01 9 views
52

Duplicar posible:
What does this C++ code mean?¿Qué significa 'temperatura sin signo: 3' en una estructura o unión?

que estoy tratando de asignar una estructura de C a Java utilizando JNA. Me encontré con algo que nunca he visto.

La definición struct es el siguiente:

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; 
}; 

se puede ver alguna variable que se define como unsigned op_attached:1 y estoy seguro de lo que haría que la media. ¿Eso afectaría el número de bytes que se asignarán para esta variable en particular?

+1

Guau, eso es completamente nuevo para mí también. Buen hallazgo! –

+4

Agregó 'dos ​​puntos' para ayudarlo a aparecer en la búsqueda. –

+0

Lo mejor que puede hacer con los campos de bits es evitarlos. Es mejor usar enmascaramiento y desplazamiento para acceder a grupos de bits en números enteros de una manera bien definida. – starblue

Respuesta

39

Este constructo especifica la longitud en bits para cada campo.

La ventaja de esto es que puede controlar el sizeof(op), si tiene cuidado. el tamaño de la estructura será la suma de los tamaños de los campos en el interior.

En su caso, el tamaño de op es de 32 bits (es decir, sizeof(op) es 4).

El tamaño siempre se redondea al siguiente múltiplo de 8 para cada grupo de xxx no firmado: yy; construir.

Eso significa:

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) 

No estoy seguro de que recuerdo esto correctamente, pero creo que lo hizo bien.

+11

¡Recuerda niños! los campos de bit son dependientes del compilador, no existe un estándar de C/C++ que especifique que los primeros 4 bits se deben usar en el a: 4 anterior. –

+1

Suponiendo 8 bits por byte. – Ferruccio

+1

Suponiendo 8 bits por byte es seguro. Sin embargo, suponiendo que el compilador no usará bits de relleno o tiene un orden de bytes específico, no lo es. – starturtle

19

Declara un bit field; el número después de dos puntos da la longitud del campo en bits (es decir, cuántos bits se usan para representarlo).

4

El modificador de dos puntos en los tipos integrales especifica cuántos bits debe tomar el int.

6
unsigned op_type:9; 

Medios op_type es una variable entera de 9 bits.

Cuestiones relacionadas