数値表現の可能性を論じてたら先に進まない。
符号付き整数の右シフトも怪しいから、

unsigned long l = (unsigned)v;
としてからo.put(l & 0xff)として書き込むのが良いかと。