Compiler Error with negative global variable shift parameter
Default Compiler using by KDS 3.2.0 with FreeRTOS
When shifting like following
Int32_t x ;
Int32_t y = 8 ;
Int8_t z = -1 ;
x = y << z;
or
x = y >> z;
If the variables y or z are global and if z is negative the result in x becomes = 0 whatever the values it should take.
All variables to the right of the "=" must be local for the function to give a correct result with z negative.
for exemple :
x = y << (u-w);
or
x = y >> (u-w);
In this case it is necessary that y, u and w be declared in local variable for correct operation with (u-w) negative.
Workaround:
The safest solution if we don't know the declaration zone, is to achieve a macro that results in always positive shift.
#define MACRO_LEFTSHIFTSIGNED_SAMEVALUE(value,shift) if ((shift) >= 0) (value) <<= (shift); \
else (value) >>= (-shift)
#define MACRO_LEFTSHIFTSIGNED(out,in,shift) if ((shift) >= 0) (out) = (in) << (shift); \
else (out) = (in) >> (-shift)
#define MACRO_RIGHTSHIFTSIGNED_SAMEVALUE(value,shift) if ((shift) >= 0) (value) >>= (shift); \
else (value) <<= (-shift)
#define MACRO_RIGHTSHIFTSIGNED(out,in,shift) if ((shift) >= 0) (out) = (in) >> (shift); \
else (out) = (in) << (-shift)
Best regards
Hello didier,
Thanks a lot for your sharing.
BR
Alice