¿Tiene sentido calificar campos de bits como firmados/no firmados?¿Admite ANSI C los campos de bits firmados/no firmados?
Respuesta
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 :)
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 se puede pensar en un uso para los campos de bits con signo, especialmente no pintoresco, obvio que sería un momento "aha" para los lectores.
Hay szenarios donde es útil. En la geometría computacional, a menudo tiene que almacenar información como "siguiente, anterior, ninguno, el mismo". Eso significa exactamente dos bits. Si se comprueba que puede comprimir su estructura a un tamaño agradable, como 2^n, puede obtener un buen impulso de rendimiento. –
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.
La parte relevante de la norma (ISO/IEC 9899: 1999) es 6.7.2.1 # 4:
Un campo de bits debe tener un tipo que es una versión calificado o no calificado de _Bool, firm int, unsigned int, o algún otro tipo de definido por la implementación.
Creo que la pregunta es acerca de ANSI C (c89/c90) no ISO C (c99). – nebuch
Sí. Un ejemplo de here:
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;
Sólo usted sabe si tiene sentido en sus proyectos; típicamente, lo hace para los campos con más de un bit, si el campo puede ser significativamente negativo.
+1 para mostrar un posible problema de portabilidad (uno contra dos) al usar bitfields –
Según esta referencia, es posible:
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc03defbitf.htm
Es muy importante calificar como sus variables con o sin signo. 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 mediante un solo bit, 1 ó 0. Para las variables firmados, el bit más significativo determina el signo (alto se trata negativo). Por lo tanto, la variable con signo, mientras se almacena como 1 en binario, se interpreta como negativa.
Ampliando este tema, un número sin signo de dos bits tiene un rango de 0 a 3, mientras que un número con signo de dos bits tiene un rango de -2 a 1.
+1 para un claro ejemplo de lo que puede salir mal. –
Bit enmascaramiento firmó tipos varía de hardware de la plataforma de hardware de la plataforma debido a la forma en que puede hacer frente a 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 con signo y sin signo. 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 sobre 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 en campos de bits firmados son útiles es en la emulación, donde la máquina emulada tiene menos bits que el texto predeterminado.
Actualmente estoy tratando de 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 Igual que si hiciera todo el enmascaramiento, extendiendo el signo, etc. explícitamente, pero leería mucho mejor ...
- 1. Biblioteca de manipulación de bits para ANSI C
- 2. Campos de bits en C#
- 3. C# ID3 biblioteca que admite campos personalizados
- 4. Campos de bits en Scala
- 5. Proveedor de persistencia para Java que admite los campos finales
- 6. ¿Cuándo vale la pena usar los campos de bits?
- 7. Cómo lenta son campos de bits en C++
- 8. Alternativa para el operador MAX en los campos de bits
- 9. por qué los campos de bits para los mismos tipos de datos tienen menos tamaño en comparación con los campos de bits para los tipos de datos mixtos
- 10. Parse JSON en ANSI C
- 11. ¿Los archivos .dmg deben estar firmados?
- 12. Diferencias de Android entre archivos .apk firmados y no firmados?
- 13. ANSI C UTF-8 problema
- 14. Campos de bits y puntos de secuencia
- 15. ANSI C vs otras normas C
- 16. ANSI C y la sobrecarga de funciones
- 17. Extraiga los campos de una estructura C
- 18. Atributos de C# en los campos
- 19. Uso práctico de campos de bits de longitud cero
- 20. ¿SVG admite la incorporación de imágenes de mapa de bits?
- 21. ANSI C equivalente de try/catch?
- 22. ¿Cómo se simulan los campos de bits en los registros Delphi?
- 23. Convirtiendo el problema ANSI en UTF8 C#
- 24. ¿Objective-C admite #elifdef?
- 25. E/S sin búfer en ANSI C
- 26. ¿pueden los applets de java (no firmados) crear/leer cookies?
- 27. Cómo convertir de K & R C a ANSI C?
- 28. ¿Campos de bits de tipo distinto de int?
- 29. ¿Admite Lua los decoradores?
- 30. ¿Qué significa estática en ANSI-C
Incorrecto. Obtienes -1, -0, +0, +1. Dos bits, cuatro estados. – Thorsten79
probablemente algo como -2, -1, 0, 1 tiene más sentido, casi nunca necesita un -0 – davr
http://en.wikipedia.org/wiki/-0_(number) – Thorsten79