Compiler Error with negative global variable shift parameter

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Compiler Error with negative global variable shift parameter

457 Views
didierjeanjean
Contributor III

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

0 Kudos
1 Reply

310 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello didier,

Thanks a lot for your sharing.

BR

Alice

0 Kudos