It verges close to off topic but you are sure about these sign extensions?
Simple zero extension will map the values around zero (16-bit on left, 24-bit on the right) as follows:
2 → 0x200 (512)
1 → 0x100 (256)
0 → 0x000 (0)
-1 → 0xffff00 (-256)
-2 → 0xfffe00 (-512)
This looks like a correct mapping to me: the difference between neighbouring samples will remain constant before and after conversion. Won’t padding with 0xff cause distortion every time we cross the zero point or did I make a mistake in the 24-bit to decimal conversion?