2008-09-29 9 views

Répondre

-4

Si un 'bit' est signé, alors vous avez une plage de -1, 0, 1, qui devient alors un chiffre ternaire. Je ne pense pas que l'abréviation standard pour ce serait approprié ici, mais fait des conversations intéressantes :)

+0

Mauvais. Vous obtenez -1, -0, +0, +1. Deux bits, quatre états. – Thorsten79

+0

probablement quelque chose comme -2, -1, 0, 1 a plus de sens, vous n'avez presque jamais besoin d'un -0 – davr

+0

http://en.wikipedia.org/wiki/-0_(numéro) – Thorsten79

2

Je ne pense pas que Andrew parle de champs de bits à un seul bit. Par exemple, champs de 4 bits: 3 bits d'information numérique, un bit de signe. Cela peut être tout à fait logique, même si j'admets ne pas être capable de sortir un tel scénario de la tête. Mise à jour: Je ne dis pas que je ne peux pas penser à une utilisation pour les champs binaires à bits multiples (les ayant utilisés tout le temps en jours de modem 2400 bps pour compresser les données autant que possible pour la transmission), mais je ne peut pas penser à une utilisation pour les champs de bits signés, en particulier pas un pittoresque, évident qui serait un moment "aha" pour les lecteurs.

+0

Il y a des szenarios où c'est utile. En géométrie computationnelle, vous devez souvent stocker des informations telles que "suivant, précédent, aucun, le même". Cela me fait exactement deux bits. Il se trouve que vous pouvez compresser votre structure à une bonne taille, comme 2^n vous pouvez obtenir un coup de pouce de peformance agréable. –

1

Oui, c'est possible. Les champs de bits C sont essentiellement des entiers à plage limitée. Souvent, les interfaces matérielles regroupent les bits de telle sorte qu'un certain contrôle peut aller, disons, de -8 à 7, auquel cas vous voulez un champ de bits signé, ou de 0 à 15, auquel cas vous voulez un bit non signé. champ.

14

La partie pertinente de la norme (ISO/IEC 9899: 1999) est 6.7.2.1 # 4:

A-champ de bits doit avoir un type qui est une version qualifié ou non qualifié de _Bool, signed int, unsigned int, ou un autre type défini par l'implémentation .

+2

Je pense que la question se pose à propos de ANSI C (c89/c90) pas ISO C (c99). – nebuch

8

Oui. Un exemple 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; 

Seulement vous savez s'il est logique dans vos projets; Généralement, il le fait pour les champs avec plus d'un bit, si le champ peut être significativement négatif.

+0

+1 pour montrer le problème de portabilité possible (complément un ou deux) lors de l'utilisation des champs de bit –

7

Il est très important de se qualifier vos variables comme signé ou non signé. Le compilateur doit savoir comment traiter vos variables lors des comparaisons et du casting. Examinez la sortie de ce code:

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

Sortie:

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

Le compilateur stocke les variables à l'aide d'un seul bit, 1 ou 0. Pour les variables signées, le bit le plus significatif détermine le signe (haute est traité négatif). Ainsi, la variable signée, alors qu'elle est stockée sous la forme 1 en binaire, est interprétée comme négative.

expansion sur ce sujet, un nombre à deux bits non signé a une gamme de 0 à 3, tandis qu'un signé deux nombres de bits a une plage de -2 à 1.

+0

+1 pour un exemple clair de ce qui peut mal se passer. –

0

Bit masquage signé types varie de matériel de la plateforme à matériel de plate-forme en raison de la façon dont il peut faire face à un débordement d'un quart de travail, etc.

Tout bon outil d'assurance qualité avertira sciemment d'une telle utilisation.

2

Très certainement, ANSI-C fournit des champs de bits signés et non signés. C'est requis. Cela fait également partie de l'écriture des superpositions de débogueur pour les types à virgule flottante IEEE-754 [[1] [5] [10]], [[1] [8] [23]], et [[1] [10] [53] ] Ceci est utile dans les traductions de type machine ou réseau de telles données, ou pour vérifier les conversions doubles (64 bits pour les maths) en demi-précision (16 bits pour la compression) avant d'envoyer un lien, comme les textures de cartes vidéo.

// 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 endroit où bitfields signés sont utiles est en émulation, où la machine émulée a moins de bits que votre mot par défaut. Je suis actuellement en train d'essayer d'émuler une machine 48 bits et j'essaie de comprendre s'il est raisonnable d'utiliser 48 bits sur un bit bit de 64 bits "long long" ... le code généré serait le même si je faisais tout le masquage, l'extension de signe etc. explicitement mais il lirait beaucoup mieux ...

Questions connexes