Har ANSI C support signert / usignerte bits felt?

stemmer
13

Er det fornuftig å kvalifisere bits felt som signerte / unsigned?

Publisert på 29/09/2008 klokken 17:53
kilden bruker
På andre språk...                            


10 svar

stemmer
14

Den aktuelle delen av standard (ISO / IEC 9899: 1999) er 6.7.2.1 # 4:

En bit-feltet skal ha en type som er kvalifisert eller ukvalifisert versjon av _Bool, signert int, usignert int, eller en annen implementering definert type.

Svarte 29/09/2008 kl. 18:11
kilden bruker

stemmer
8

Ja. Et eksempel fra her :

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;

Bare du vet om det er fornuftig i dine prosjekter; vanligvis gjør det for felt mer enn en bit med, hvis feltet kan menings være negativ.

Svarte 29/09/2008 kl. 18:11
kilden bruker

stemmer
7

Det er veldig viktig å kvalifisere variabler som signert eller usignert. Kompilatoren må vite hvordan du behandler dine variabler under sammenligninger og støping. Undersøke resultatet av denne koden:

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

Produksjon:

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

Kompilatoren lagrer variable ved hjelp av en enkelt bit, 1 eller 0. For variabler signert, bestemmer den mest signifikante bit fortegnet (høy behandles negativ). Således, den signerte variabel, mens det blir lagret som en i binærformat, blir det tolket som en negativ.

Utvider på dette emnet, har en usignert to bits tall et område fra 0 til 3, mens en signert to bits tall som har en rekkevidde på -2 til-1.

Svarte 28/10/2008 kl. 18:41
kilden bruker

stemmer
2

Absolutt ANSI-C gir for signerte og usignerte bits felt. Det kreves. Dette er også en del av skriving feilsøkings overlegg for IEEE-754 flytepunkttypene [[1] [5] [10]], [[1] [8] [23]] og [[1] [10] [53] ]. Dette er nyttig i maskintype eller nettverks oversettelser av slike data, eller kontroll av konverterdobbelt (64 bits for matte) til halvparten presisjon (16 biter for kompresjon) før sending over en kobling, som skjermkort teksturer.

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

Svarte 04/01/2011 kl. 01:51
kilden bruker

stemmer
2

Jeg tror ikke Andrew snakker om single-bit bit felt. For eksempel, 4-bits felt: 3 biter av numerisk informasjon, en bit for tegn. Dette kan helt fornuftig, men jeg innrømmer å ikke være i stand til å komme opp med et slikt scenario av toppen av hodet mitt.

Oppdatering: Jeg sier ikke at jeg kan ikke tenke meg en bruk for multi-bit bit felt (etter å ha brukt dem hele tiden tilbake i 2400bps modem dager for å komprimere data så mye som mulig for overføring), men jeg kan ikke tenke av en bruk for signerte bits felt, spesielt ikke en sjarmerende, åpenbart en som ville være en "aha" øyeblikk for leserne.

Svarte 29/09/2008 kl. 18:00
kilden bruker

stemmer
1

Ett sted hvor signert bitfields er nyttige i emulering, der emulert maskinen har færre bits enn standard ord.

Jeg er for tiden ute på emulerer en 48-bit maskin og prøver å finne ut om det er fornuftig å bruke 48 bits ut av en 64-bit "lang lang" via bitfields ... den genererte koden ville være det samme som om jeg gjorde alt maskerings, melder utvide etc eksplisitt, men det ville lest mye bedre ...

Svarte 18/01/2012 kl. 16:46
kilden bruker

stemmer
1

Ja det kan det. C bit-felt er egentlig bare begrenset rekkevidde heltall. Vanlige maskinvaregrensesnitt pakke biter sammen på en slik en gang at en viss kontroll kan gå fra, sier -8-7, i så fall vil ha en signert bit-feltet, eller fra 0 til 15, der tilfelle du ønsker en usignert bit- felt.

Svarte 29/09/2008 kl. 18:05
kilden bruker

stemmer
0

Bit maske signerte masse varierer fra plattform til plattform maskinvare maskinvare på grunn av hvordan den kan behandle et overløp fra et skift etc.

Enhver halv god QA verktøyet vil advare bevisst på slik bruk.

Svarte 30/07/2009 kl. 19:47
kilden bruker

Svarte 29/09/2008 kl. 18:14
kilden bruker

stemmer
-4

hvis en 'litt' er signert, da har du et utvalg av -1, 0, 1, som deretter blir en trefoldig siffer. Jeg tror ikke standard forkortelse for det ville være egnet her, men gjør for interessante samtaler :)

Svarte 29/09/2008 kl. 17:58
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more