We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
typedef struct { int query_zone:4; }statusrequest_t; statusrequest_t state; state.query_zone=8; if ( state.query_zone==8) printf("The result matches n=%i n\r",state.query_zone); else printf("This should not occur n=%i\n\r",state.query_zone);
CARM produces : This should not occur n=-8 RV produces : The result matches n=8
typedef struct { short query_zone:4; }statusrequest_t;
CARM produces : The result matches n=8 RV produces : This should not occur n=-8
typedef struct { signed char query_zone:4; }statusrequest_t;
Why does the comparision fail when query_zone is an int bitfield ? The RV compiler produces not the same result as CARM
Assuming a twos-complement representation, a 4-bit (implicitly signed) integer can hold values in the range -8 through 7. 8 is not in that range.
The Standard states that it is implementation-defined whether a bitfield declared without signed or unsigned qualifiers is interpreted as signed or unsigned. When used in expressions, the bit-field value is promoted to the int arithmetic type either signed or unsigned.
The RV 3.0 Compiler & Libraries MANUAL documents the bit-field allocation rules, and states that unqualified bit-fields are interpreted as unsigned.
This is why bitfield declarations should always be explicitly sign-qualified, to stay away of compiler implementation choices.
Your first and last examples for RV are consistent with the manual: the first one is 8, and the last is -8 (binary 1000 sign-extended to 0xFFFFFFF8 in signed 2's complement).
But your second example is not right. A short bitfield should evaluate to 8, like the first example. I couldn't reproduce your declared behaviour. Are you sure RV is returning -8 for the short bitfield example?
Noel, are you still following this thread anymore? Can you give feedback?
i will look again at the problem, i am not in the possibility to do this in the next coming days.