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