type fields campos c struct bit-fields

fields - ¿Admite ANSI C los campos de bits firmados/sin firmar?



bit type c (10)

¿Tiene sentido calificar los campos de bits como firmados / no firmados?



No creo que Andrew esté hablando de campos de bits de un solo bit. Por ejemplo, campos de 4 bits: 3 bits de información numérica, un bit para el signo. Esto puede tener sentido, aunque admito que no soy capaz de pensar en semejante escenario.

Actualización: No digo que no pueda pensar en un uso para campos de bits de múltiples bits (habiéndolos usado todo el tiempo en días de módem de 2400bps para comprimir los datos tanto como sea posible para la transmisión), pero no puedo pensar de un uso para campos de bit con signo, especialmente no pintoresco, obvio que sería un momento "aha" para los lectores.


Sí puede. Los campos de bits C son esencialmente solo enteros de rango limitado. Con frecuencia, las interfaces de hardware empacan bits de forma tal que algún control puede ir desde, digamos, -8 a 7, en cuyo caso usted quiere un campo de bit firmado, o de 0 a 15, en cuyo caso desea un bit sin signo. campo.


Sí. Un ejemplo de aquí :

struct { /* field 4 bits wide */ unsigned field1 :4; /* * unnamed 3 bit field * unnamed fields allow for padding */ unsigned :3; /* * one-bit field * can only be 0 or -1 in two''s complement! */ signed field2 :1; /* align next field on a storage unit */ unsigned :0; unsigned field3 :6; }full_of_fields;

Solo tú sabes si tiene sentido en tus proyectos; típicamente, lo hace para los campos con más de un bit, si el campo puede ser significativamente negativo.


si se firma un ''bit'', entonces tiene un rango de -1, 0, 1, que luego se convierte en un dígito ternario. No creo que la abreviatura estándar para eso sea adecuada aquí, pero hace que las conversaciones sean interesantes :)


Es muy importante calificar sus variables como firmadas o sin firmar. El compilador necesita saber cómo tratar sus variables durante las comparaciones y el casting. Examine el resultado de este código:

#include <stdio.h> typedef struct { signed s : 1; unsigned u : 1; } BitStruct; int main(void) { BitStruct x; x.s = 1; x.u = 1; printf("s: %d /t u: %d/r/n", x.s, x.u); printf("s>0: %d /t u>0: %d/r/n", x.s > 0, x.u > 0); return 0; }

Salida:

s: -1 u: 1 s>0: 0 u>0: 1

El compilador almacena la variable usando un solo bit, 1 o 0. Para las variables con signo, el bit más significativo determina el signo (el valor alto se trata como negativo). Por lo tanto, la variable con signo, mientras se almacena como 1 en binario, se interpreta como negativa.

Ampliando en este tema, un número de dos bits sin signo tiene un rango de 0 a 3, mientras que un número de dos bits con signo tiene un rango de -2 a 1.


La porción relevante del estándar (ISO / IEC 9899: 1999) es 6.7.2.1 # 4:

Un campo de bits debe tener un tipo que sea una versión calificada o no calificada de _Bool, firmado int, unsigned int, o algún otro tipo definido por la implementación.


Los tipos con signo de enmascaramiento de bits varían desde el hardware de la plataforma hasta el hardware de la plataforma debido a la forma en que puede tratar un desbordamiento de un cambio, etc.

Cualquier herramienta de control de calidad medio buena advertirá a sabiendas de tal uso.


Lo más seguro es que ANSI-C proporciona campos de bits firmados y sin firmar. Es requerido. Esto también forma parte de la escritura de superposiciones de depurador para los tipos de punto flotante IEEE-754 [[1] [5] [10]], [[1] [8] [23]] y [[1] [10] [53] ] Esto es útil en el tipo de máquina o en las traducciones de red de dichos datos, o en el doble de conversiones (64 bits para matemática) a media precisión (16 bits para compresión) antes de enviarse por un enlace, como texturas de tarjeta de video.

// Fields need to be reordered based on machine/compiler endian orientation typedef union _DebugFloat { float f; unsigned long u; struct _Fields { signed s : 1; unsigned e : 8; unsigned m : 23; } fields; } DebugFloat;

Eric


Un lugar donde los campos de bits firmados son útiles es la emulación, donde la máquina emulada tiene menos bits que su palabra predeterminada.

Actualmente estoy buscando emular una máquina de 48 bits y estoy tratando de determinar si es razonable usar 48 bits de un "largo" de 64 bits en los campos de bits ... el código generado sería el mismo que si Hizo todo el enmascaramiento, extender el signo, etc. explícitamente, pero leería mucho mejor ...