You are using the term "lvalue" incorrectly. You probably mean “variable” or “object”.
In the case of sizeof(0xFFFFFFFF) == 1 and plain char unsigned , then char a = 0xffffFFFF; simple, since this value can be represented in char .
In other cases, this conversion is out of range. If a plain char is unsigned, this means that a large positive number 0xFFFFFFFF configured modulo UCHAR_MAX+1 to match (on common systems, a regular char gets 255 ).
If a plain char is signed, then this is the behavior defined by the implementation (and in C, it can raise the signal defined by the implementation). The most common implementation definition is a two-pad truncation that would give char a value of -1 , but this is not guaranteed.
Moving on a bitfield. 0xffffFFFF/2 - 1 - 0x7FFFFFFE . This is assigned to a bit field of type int and width 3 , which requests a conversion out of range, as in the signed case of char . As before, this is the definition of the implementation (and may raise the signal defined by the implementation by C).
Check your compiler documentation for what it sets here, although I would again expect it to use 2 add-on truncations, giving -2 .
source share