Defect Report #120
Submission Date: 03 Dec 93
Submittor: WG14
Source: Ron Guilmette
Question
ANSI/ISO C Defect Report #rfg27:
Subject: Semantics of assignment to (and initialization of) bit-fields.
a) Is the following program strictly conforming?
b) Must a conforming implementation translate this code into 
an executable program which prints 3 3?
#include <stdio.h>
struct S { unsigned bit:1; };
struct S object1 = { 3 };	/* ? */
struct S object2;
int main ()
	{
	object2.bit = 3;	/* ? */
	printf ("%d %d\n", object1.bit, object2.bit);
	return 0;
	}
Background:
Subclause 6.3.16.1 (Semantics):
In simple assignment (=),
the value of the right operand 
is converted to the type of the assignment expression and replaces 
the value stored in the object designated by the left operand.
Subclause 6.2.1.2 (Semantics):
When a value with integral type is converted to another integral 
type, if the value can be represented by the new type, its value is 
unchanged.
Unless I'm mistaken, the type of the assignment expression:
	object2.bit = 3; 
in the above example is type unsigned int. Thus, according to 
the rules quoted here, the value of 3 is converted to an unsigned 
int type value (during this assignment statement) and it is otherwise 
unchanged. Then, that value of 3 replaces the previous value 
of object2.bit.
I believe that the above examples illustrate the point that the C 
Standard currently fails to adequately describe the semantics of assignments 
to (and/or initializations of) bit-fields in cases where the value 
being assigned will not actually fit into the bit-field object.
In lieu of any description of the special semantics of assignments 
to bitfields, it appears to be currently necessary for both 
implementors and users to assume that the ``normal'' assignment 
semantics apply, but as you can see from the above examples, such 
assumptions lead to highly counterintuitive
expectations (and to expectations 
which fly in the face of actual current common practice).
I believe that the Committee should rectify the current unfortunate 
situation by adding to subclause 6.3.16.1 (or maybe to subclause 6.2.1.2) 
some additional new verbage explicitly describing the special semantics 
of assignments to bit-fields.
Response
Subclause 6.5.2.1 states ``A bit-field is interpreted as an integral
type consisting of the specified number of bits.'' Thus the type of
object1.bit and object2.bit
can be informally described as
unsigned int : 1.
A larger integer is converted to this type according
to the rules in subclause 6.2.1.2.
Thus the value 3 is converted to the value 1.
The program is strictly conforming.
It prints 1 1.
Previous Defect Report
< - > 
Next Defect Report