Überraschendes Verhalten bei der Verwendung von static_cast für Strukturen mit BitfeldernC++

Programme in C++. Entwicklerforum
Anonymous
 Überraschendes Verhalten bei der Verwendung von static_cast für Strukturen mit Bitfeldern

Post by Anonymous »

Der folgende Code wird auf std >= C++20 kompiliert, schlägt jedoch auf std < C++20 fehl. Dies gilt für msvc, gcc und clang.

Code: Select all

#include 

int main()
{
struct byte
{
unsigned char high : 4;
unsigned char low : 4;
};

unsigned char u = 0xFF;
byte b = static_cast(u);

printf("%d %d", b.high, b.low);

return 0;
}
Unabhängig davon, ob die statische Umwandlung zur Kompilierungszeit oder zur Laufzeit durchgeführt wird, ist das Ergebnis immer das gleiche:

Code: Select all

b.high
ist auf 15

gesetzt

Code: Select all

b.low
ist auf 0 gesetzt
Egal wie groß das erste Bitfeld in Bits ist oder wie viele Bitfelder darauf folgen, nur das erste Bitfeld empfängt die Bits von der Quelle von static_cast, und alle anderen sind scheinbar immer auf 0 gesetzt.
Das ist für mich sehr überraschend, ich hätte erwartet, dass entweder ein Kompilierungsfehler vorliegt oder alle Bitfelder „richtig“ gesetzt sind.
Warum ist das so? Handelt es sich um ein undefiniertes Verhalten (unwahrscheinlich, da es zur Kompilierungszeit kompiliert und ausgeführt wird) oder ist es vom Standard vorgeschrieben?

https://godbolt.org/z/z9jnzETsq

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post