Forum: Compiler & IDEs struct-variable nimmt anderen Wert als angegeben


von Johannes (Gast)


Lesenswert?

Hi,
ich möchte einen struct programmieren, habe dabei aber ein problem
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
int main() {
5
  struct error {
6
    char error1 : 1;
7
    char error2 : 1;
8
    char error3 : 1;
9
  };
10
  
11
  struct error test;
12
  
13
  test.error1 = 1;
14
  
15
  printf ("error1 %d\n", test.error1);
16
  printf ("error2 %d\n", test.error2);
17
  printf ("error3 %d\n", test.error3);
18
  system("pause");
19
  return 0;
20
}

als Ergebnis bekome ihc jetzt aber

error1 -1
error2 0
error3 0

wieso bekomme ich für error1 eine -1? ich schreibe doch vorher eine eins 
hinein.

Johannes

von Stefan K. (stefan64)


Lesenswert?

Definiere Deine Bits als unsigned:
1
  struct error {
2
    unsigned char error1 : 1;
3
    unsigned char error2 : 1;
4
    unsigned char error3 : 1;
5
  };

Gruß, Stefan

von Karl H. (kbuchegg)


Lesenswert?

Merk dir eines:
Es gibt 3(!) kleine Datentypen
signed char
unsigned char
char

Bei char überlässt du es dem Compiler, ob er dafür ein Vorzeichen 
annehmen will oder nicht. UND DAS WILLST DU NICHT!

char nimmst du nur dann, wenn du Textverarbeitung machst. Ansonsten 
nimmst du immer entweder signed char oder unsigned char! Diese unselige 
Praxis, den Datentyp Byte mit 'char' gleichzusetzen, die stellst du 
gleich wieder ab. Die bringt mehr Ärger als sonst was. Wenn du 1 Byte 
haben willst, dann ist der Datentypen dafür 'unsigned char' oder 
'uint8_t'. Und dann hast du auch weniger Probleme.

von Johannes (Gast)


Lesenswert?

Jawohl Sir!!! :)

es lag tatsächlich daran. Werde es mir für die Zukunft merken, immer 
unsigned/signed char zu benutzen.

Besten dank für eure Antworten. Jetzt kann es weiter gehen

Johannes

von Dirk B. (dirkb2)


Lesenswert?

Johannes schrieb:
> Werde es mir für die Zukunft merken, immer
> unsigned/signed char zu benutzen.

Da nimm besser int_least8_t (oder int8_t) bzw. uint_least8_t (oder 
uint8_t)

Und für Zeichen und C-Strings nimmst du weiterhin char bzw. char[], 
char*

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Dirk B. schrieb:
> Da nimm besser int_least8_t (oder int8_t) bzw. uint_least8_t (oder
> uint8_t)

Es hängt aber von er Implementation ab, welchen Basistyp ein Bitfeld 
haben kann.  Der Standard garantiert nur wienige wie z.B. unsigned.

von Dirk B. (dirkb2)


Lesenswert?

Ich meinte das Allgemein und nicht speziell für ein Bitfeld.

Die Aussage von Johannes ("immer unsigned/signed char zu benutzen") ließ 
mich befürchten, dass er nie mehr char verwendet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.