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)?

Parents Reply Children