2008-09-29 10 views

Respuesta

-4

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 :)

+0

Incorrecto. Obtienes -1, -0, +0, +1. Dos bits, cuatro estados. – Thorsten79

+0

probablemente algo como -2, -1, 0, 1 tiene más sentido, casi nunca necesita un -0 – davr

+0

http://en.wikipedia.org/wiki/-0_(number) – Thorsten79

2

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.

+0

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. –

1

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.

14

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.

+2

Creo que la pregunta es acerca de ANSI C (c89/c90) no ISO C (c99). – nebuch

8

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.

+0

+1 para mostrar un posible problema de portabilidad (uno contra dos) al usar bitfields –

7

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.

+0

+1 para un claro ejemplo de lo que puede salir mal. –

0

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.

2

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

1

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 ...

Cuestiones relacionadas