Accelerometer Bosch BMI055 returns 8 bit overflowed values?
I think you are getting messed up by necessity for the sign of the number to be extended to the left. My reading of the datasheet is that the MSB and LSB registers give you a set of 12 bits, which, as a 12-bit number is to be considered to be in two's complement format.

So, you should first combine the values together, then if necessary, perform any fix to ensure it's a legit two's complement number given the size of the data type you've put it in. Then scale it if needed.

I'd suggest: first choose a target data size that's big enough to hold the result. Let's say you are using C on an MCU, and you can choose signed short, and it is 16 bits. (None of these are a given, BTW).

Let's also assume that MSB and LSB are 8-bit numbers. Now:

signed short result = (MSB &lt;&lt; 8) | (LSB &amp; 0xF0)

This should give you a number that's already in two's complement format, as signed short expects to be. This will give you a range of numbers that's 16 times the raw 12 bit number, but properly ranges around zero.

You might then want to scale it by dividing by 16. You might think to perform that division using scaledresult = (result >> 4)  but if so you will need to check whether right shift performs sign extension. That is, sets scaledresult[15..12] to 1 if result[15] was 1.