From: Erik P. <epe...@iv...> - 2004-06-20 16:55:08
|
On Sun, 20 Jun 2004, Maarten Brock wrote: > So have we agreed that bit behaves like a C99 _Bool? > And if so, does anyone have a clue how C99 promotes a _Bool to an > (unsigned) integer? I guess 0 (false) will be 0U, but will 1 (true) > become 1U or -1U ? Apparently SDCC currently converts 1(true) to 1U. ISO/IEC 9899:1999 6.2.5 says that the "type _Bool and the unsigned integer types that correspond to the standard signed integer types are the standard unsigned integer types." > > Since "bit" is not defined by the C standard, its implementation > > varies between various 8051 C compilers. I experimented with a number > > of other compilers today (like SDCC, their documentation is not as > > explicit as it should be about this language extension). Keil's C51 > > and Raisonance's RC-51 treats "bit" as a boolean type. Hi-Tech's > > 8051-C treats "bit" as an unsigned int with a width of 1. It seems > > that none of these perform integer promotion on bit operands (except > > during assignment). > > > >=A0=A0 Erik > What exact experiments did you do? I have access to an IAR compiler and > they consider C99 conformance a high priority. I would like to compare > the results. I looked at the generated code for a number of functions. It was=20 certainly not an exhaustive test. bit b; char c; void char2bit (void) { b =3D c; /* Keil C51 & Raisonance RC-51 behave like b =3D c ? 1 : 0 (bits */ /* are boolean), whereas Hi-Tech 8051-C behaves like b =3D c & 1 */ /* (bits are unsigned:1) */ } void compBit (void) { b =3D ~b; /* Hi-Tech 8051-C rejects ~ as an bad operator for a bit; */ /* hence, integer promotion of the bit is not being performed. */ /* The others treat this as b =3D !b */ } void compBit2char (void) { c =3D ~b; /* Keil C51 & Raisonance RC-51 behave like c =3D !b; hence, */ /* integer promotion of the bit is not being performed. */ } void compCastBit2char (void) { c =3D ~((char)b); /* With the explicit cast, all three work as expected */ } void doubleBit (void) { b =3D b + b; /* Hi-Tech 8051-C generates b =3D !b ? b : !b, which results */ /* in b =3D 0 (a partial optimization consistent with the */ /* doubleBit2char and char2bit results). Raisonance RC-51 */ /* behaves like b =3D b | b. Keil C51 rejects + as a bad */ /* operator for a bit. */ } void doubleBit2char (void) { c =3D b + b; /* Hi-Tech 8051-C behaves like c =3D (char)b + (char)b. */ /* Raisonance RC-51 behaves like c =3D b | b. */ } void addBit2char (void) { c =3D c + b; /* Hi-Tech 8051-C and Raisonance RC-51 behave like */ /* c =3D c + (char)b. Keil C51 still rejects + as a bad */ /* operator. */ } I just tried the addition tests today, with the surprise results that Hi-Tech 8051-C and Raisonance RC-51 will do integer promotion on bit types for at least some cases. If SDCC treats "bit" as "_Bool", we will at least have a coherent standard to follow. Erik |