The following program will print "true" with optimization turned off, and "false" when optimization is set to "Maximize Speed", if you input 0 when it runs:
#include <stdio.h>
int main(int argc, char *argv[])
{
struct foo
{
unsigned char a;
unsigned char b;
};
#define Civility(X) ((int)X.a * 100 + (int)X.b)
struct foo Ralf[2] = {{1,14}, {0, 0}};
struct foo baboon[2] = {{3,13}, {0, 0}};
int j;
scanf("%d", &j);
printf((Civility(Ralf[j]) < Civility(baboon[j])) ? "true\n" : "false\n");
}
The correct answer is "true" - Civility(Ralf[j]) < Civility(baboon[j]) for all j.
The problem appears to be that despite the explicit casts to int in the conditional expression, the compiler generates byte arithmetic and a byte compare with optimiztion on, and does byte-to-int conversions with optimization off. If I read the C specification correctly, the "usual arithmetic conversions" should cause byte-to-int conversions even in the absence of the explicit casts.
I have not tested this on the 32-bit version of RC3. The 32-bit version of V7.00 does 32-bit compares even with optimizations turned on.
Richie