Also liegt es doch am Compiler.

*(char*)(&bits) = 127;

Casten ist die einzige Möglichkeit, ein Bitfeld zu konvertieren, sonst geht es über Unions, wie du es schon gemacht hast. Ich bin mir nicht sicher, ob es auch so geht: (char)(bits)