jremington:
The output of each axis of each sensor consists of two 8 bit register values, which must be combined into one 16 bit variable.Here only mag_x needs to be a 16 bit integer variable. mag_xH and mag_xL can be 8 bit, of type char or uint8_t.
mag_xL = Wire.read();
mag_xH = Wire.read();
mag_x = (mag_xH << 8) | mag_xL;
You are right!
I change it also from int8_t to uint8_t or char and it also works!
So now I think that I understand not only where I was wrong but also why I was wrong:
I think that because the full 16 bit value (representing the sensor value for each axis) is stored inside two different 8 bit registers, and because I was reading 8 bit separately from each register and storing the values inside two different parameters, so I can't allow those parameters separately to be negative, only after I add those 8 bits together into the full 16 bit I should allow it to be negative, because only the full 16 bit number representing the real value from the sensor.
Thanks a lot for your help!