Cast Problem

Gast #2777969
Lesenswert?

Hallo ich bin noch relative neu in der C programmierung. Also bitte ich 
um nachsehen für meine Unwissenheit. Ich habe ein Bitfeld nun ein Wert 
entspricht 2 bit in meinem Bitfeld. Nun caste ich diesen Wert in einen 
uint8. Jetzt meine Frage kann es irgend wie passieren das auch mal ein 
Wert größer als 3 (2 Bit max) in meiner uint8 Varibalen steht?
Gast #2777977
Lesenswert?

1
#define GetSensLevelRq(variable) ((variable).Sens1_Rq)
2

3
ist ein Makro wie ich die auf die einzelnen Felder des Bitfeld's zugreife.
4

5
uint8 Sens1Value
6
Sens1Value = (uint8)(GetSensLevelRq(SENS_RQ));
7

8
if(Sens1Value > 2)
9
{
10

11
// hier kommen dann Fehlerbehandlung
12

13
}
#2778008
Lesenswert?

C_Dummy schrieb:

> Jetzt meine Frage kann es irgend wie passieren das auch mal ein
> Wert größer als 3 (2 Bit max) in meiner uint8 Varibalen steht?

Nein, kann nicht sein.

Bitfelder sind ja im Grunde auch nichts anderes, als das du dem Compiler 
die Aufgabe der Ausmaskierung und Zurechtschieberei überträgst. Der 
Compiler kann auch nichts anderes tun, als das was du händisch machen 
würdest, wenn du Einzelbits bearbeitest.
Gast #2778023
Lesenswert?

Peter II schrieb:
> Karl Heinz Buchegger schrieb:
>> Nein, kann nicht sein.
>
> aber die anderen Bits habe ja keine Verwendung, steht es dem compieler
> dann nicht frei ob sie 1 oder 0 sind? Bei einem Cast würde sie dann aber
> übernommen werden.

Natürlich steht es dem Compiler frei diese Bits zu belegen wie er 
möchte. Er muss aber im Moment des Zugriffes auf den uint8 
sicherstellen, dass der richtige Wert da steht. Das tut auch jeder 
Compiler, ansonsten ist kein Programm lauffähig und der Compiler wäre 
Schrott ^^
#2778027
Lesenswert?

Peter II schrieb:
> Karl Heinz Buchegger schrieb:
>> Nein, kann nicht sein.
>
> aber die anderen Bits habe ja keine Verwendung, steht es dem compieler
> dann nicht frei ob sie 1 oder 0 sind? Bei einem Cast würde sie dann aber
> übernommen werden.

Der Cast kommt ja erst, nachdem der COmpiler bereits die beiden Bits 
extrahiert hat. Von den restlichen Bits, die du im Original hast, bleibt 
im Zuge dessen nichts übrig.

Und es fragt sich, wozu er da überhaupt casten will. Viele Probleme 
wären erst gar nicht entstanden, wenn die Programmierer einen Cast nicht 
als Kavaliersdelikt auffassen würden. Wer exzessiv Casten MUSS (also 
wirklich muss, und nicht einfach nur einen Cast reinmacht weil gerade 
schönes Wetter ist), der sollte sich mal seine benutzten Datentypen 
genauer ansehen. Casts sind die Ausnahme und nicht die Regel.
#2778259
Lesenswert?

Johann L. schrieb:
> #include <stdint.h>
>
> struct s { char a : 2; } s;
>
> uint8_t geta (void)
> {
>     return (uint8_t) s.a;
> }
> geta kann zB 255 liefern.

Ist ja auch Lötzinn.
1
#include <stdint.h>
2
 
3
struct s { unsigned char a : 2; } s;
4
 
5
uint8_t geta (void)
6
{
7
    return s.a;
8
}

Jetzt passiert es nicht mehr.
Und wenn du jetzt noch erklärst warum, hast Du C ein bischen mehr 
verstanden.

Volker
#2778328
Lesenswert?

Volker Zabe schrieb:

> Und wenn du jetzt noch erklärst warum, hast Du C ein bischen mehr
> verstanden.

Ich hoffe du meinst nicht Johann sondern den TO mit dieser Aussage :-)
Denn Johann versteht von C mit Sicherheit mehr als 99% der hier 
Anwesenden.

Und er hatte Recht: Ich hab bei meiner Aussage eine Annahme getroffen, 
die der TO nicht erwähnt hat - dass er die Definition des Bitfeldes 
sinnvoll gemacht hat.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren