wrong readings from ADXL345

No, you've already figured it out. All 16 bits set in a two byte signed integer represents -1; in a 4 byte signed integer, the lower 16 bits set represents 65535 (-1 would be represented by all 32 bits set). The highest bit in a signed integer holds the sign of the number, + or -ve; the rest of the bits hold the actual value. To change the sign of an integer, the rule is to change all the zero bits to ones, and all the one bits to zero. That produces what is called the "one's complement". And then add one to that (using unsigned overflow arithmetic). That produces the "two's complement". If you are curious, you can read why it is represented this way here:

More practically, for your problem, a quick fix would be to declare the offending 32 bit int as int16_t in the Due code. Then you'll be working with a 16 bit signed int on both platforms.