2008-09-29 8 views

Antwort

-4

Wenn ein 'Bit' signiert ist, haben Sie einen Bereich von -1, 0, 1, der dann zu einer dreistelligen Zahl wird. Ich denke nicht, dass die Standardabkürzung dafür geeignet wäre, aber für interessante Gespräche sorgt :)

+0

Falsch. Sie erhalten -1, -0, +0, +1. Zwei Bits, vier Zustände. – Thorsten79

+0

wahrscheinlich so etwas wie -2, -1, 0, 1 mehr Sinn macht, Sie fast nie brauchen eine -0 – davr

+0

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

2

Ich glaube nicht, dass Andrew über Single-Bit-Bit-Felder spricht. Zum Beispiel 4-Bit-Felder: 3 Bits numerischer Information, ein Bit für Vorzeichen. Das kann durchaus Sinn machen, auch wenn ich zugeben muss, dass ich nicht in der Lage bin, ein solches Szenario auf den Kopf zu stellen.

Update: Ich sage nicht, dass ich nicht an eine Verwendung für Multi-Bit-Bit-Felder denken kann (habe sie die ganze Zeit in 2400bps Modem Tagen verwendet, um Daten für die Übertragung so weit wie möglich zu komprimieren), aber ich Ich denke nicht an eine Verwendung für vorzeichenbehaftete Bitfelder, besonders nicht an eine kuriose, offensichtliche, die für Leser ein "Aha" -Moment wäre.

+0

Es gibt Szenarios wo es nützlich ist. In der Computergeometrie müssen oft Informationen wie "next, previous, none, the-same" gespeichert werden. Das sind genau zwei Bits. Es passiert, dass Sie Ihre Struktur auf eine schöne Größe wie 2^n komprimieren können, die Sie vielleicht einen netten Peformance Boost bekommen. –

1

Ja, kann es. C-Bit-Felder sind im Wesentlichen nur Ganzzahlen mit begrenztem Bereich. Häufig packen Hardwareschnittstellen Bits so zusammen, dass eine Steuerung von beispielsweise -8 bis 7 gehen kann, wobei in diesem Fall ein vorzeichenbehaftetes Bitfeld oder von 0 bis 15 gewünscht ist, wobei in diesem Fall ein vorzeichenloses Bit gewünscht wird. Feld.

14

Der relevante Teil des Standards (ISO/IEC 9899: 1999) ist 6.7.2.1 # 4:

Ein Bit-Feld, das einen Typ haben soll, die eine qualifizierte oder unqualifizierte Version von _Bool ist, signed int, unsigned int oder ein anderer von der Implementierung definierter Typ .

+2

Ich denke, die Frage fragt nach ANSI C (c89/c90) und nicht nach ISO C (c99). – nebuch

8

Ja. Ein Beispiel aus 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; 

Nur Sie wissen, ob es sinnvoll in Ihren Projekten macht; normalerweise für Felder mit mehr als einem Bit, wenn das Feld sinnvoll negativ sein kann.

+0

+1 für das mögliche Portabilitätsproblem (eins gegen zwei) bei Verwendung von Bitfeldern –

7

Es ist sehr wichtig, um Ihre Variablen zu qualifizieren als signiert oder unsigniert. Der Compiler muss wissen, wie er seine Variablen bei Vergleichen und Casting behandelt. Überprüfen Sie die Ausgabe dieses Codes:

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

Ausgang:

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

Der Compiler speichert die Variable ein einzelnes Bit, 1 oder 0. Für signierte Variablen, das höchstwertige Bit bestimmt das Vorzeichen (high wird negativ behandelt). Daher wird die signierte Variable, während sie als 1 in binär gespeichert wird, als negative interpretiert.

zu diesem Thema Aufweiten, ein unsigned zwei Bitzahl hat einen Bereich von 0 bis 3, während ein signiertes zwei Bitzahl einen Bereich von -2 bis 1 aufweist

+0

+1 für ein klares Beispiel, was schiefgehen kann. –

0

Bitmaskierung Typen signierten variiert von Plattform-Hardware Plattform-Hardware aufgrund, wie es mit einem Überlauf von einer Schicht etc. umgehen kann.

Jede halb gute QA-Tool warnt wissentlich vor einer solchen Verwendung.

2

Sicherlich ANSI-C bietet für vorzeichenbehaftete und vorzeichenlose Bitfelder. Es ist notwendig. Dies ist auch Teil des Schreibens von Debugger-Überlagerungen für IEEE-754 Fließkommaarten [[1] [5] [10]], [[1] [8] [23]] und [[1] [10] [53] ]. Dies ist nützlich bei Maschinentyp- oder Netzwerkübersetzungen solcher Daten oder bei der Überprüfung von Konvertierungen doppelt (64 Bits für Mathematik) auf halbe Genauigkeit (16 Bits für Komprimierung), bevor sie über eine Verbindung gesendet werden, wie bei Grafikkarten-Texturen.

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

Ein Ort, an dem unterzeichneten bitfields nützlich sind, ist in der Emulation, wo die emulierte Maschine weniger Bits als Ihr Standard-Wort hat.

Ich bin derzeit auf der Suche nach einer 48-Bit-Maschine und versuche zu trainieren, wenn es sinnvoll ist, 48 Bits aus einem 64-Bit "long long" über Bitfelder zu verwenden ... der generierte Code wäre der Das Gleiche, als wenn ich die ganze Maskierung, Vorzeichenerweiterung usw. explizit machen würde, aber es würde viel besser lesen ...