signed short decode(unsigned char t) { int exp = 0x8 - (0x7 & (t >> 4)); int base = (0x1 << (exp+ 5)) - 34; int step = 0x1 << exp; signed short ret = base - step * (0xf & t); ret = -ret - 1 + (2 * ret + 1) * (t >> 7); return ret; }