This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

armcc 5.06 typecasting / promotion question

I encountered some unexpected results when porting some older code involving the way armcc appears to handle types.  Note that uint16_t is an "unsigned short".

In compilers I'm familiar with, if you do the following:

uint16_t x = 0x0001

uint16_t y = 0x0002

then the following IF statement will be evaluated as true:

if((x-y) > 0x8000)

This is because the subtraction of 2 uint16_t variables returns a uint16_t result of 0xFFFF.

When compiling and running the test code below with armcc:

uint16_t x;
uint16_t y;
uint16_t z1[2];
bool result[8];
   
x = 0x0001;
y = 0x0002;
z1[0] = x - y;
z1[1] = (uint16_t)(x - y);

if((x-y) > 0x8000) result[0] = 1;
if((uint16_t)(x-y) > 0x8000) result[1] = 1;
if((x-y) > (uint16_t)(0x8000)) result[2] = 1;
if((uint16_t)(x-y) > (uint16_t)(0x8000)) result[3] = 1;
if(z1[0] > 0x8000) result[4] = 1;
if((uint16_t)(z1[0]) > 0x8000) result[5] = 1;
if(z1[0] > (uint16_t)(0x8000)) result[6] = 1;
if((uint16_t)(z1[0]) > (uint16_t)(0x8000)) result[7] = 1;

I get the following results:

z1[0] is 0xFFFF

z1[0] is 0xFFFF

result[0] is 0

result[1] is 1

result[2] is 0

result[3] is 1

result[4] is 1

result[5] is 1

result[6] is 1

result[7] is 1

Why do I have to typecast the result of subtracting two uint16_t variables as uint16_t for the if statement to evaluate as true?  Is there some place in the armcc documentation that explains how the compiler handles these evaluations (promotions, automatic typecasting, etc)?