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;
}
Code: Select all
b.highgesetzt
Code: Select all
b.lowEgal 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
Mobile version