There's no method Convert.ToString (sbyte, int). The closest one is Convert.ToString (Int16, int) as an Int16 is the smallest datatype which can fit an sbyte. So what happens is that the (Int16, int) overload is chosen when you pass an (sbyte, int). That's why you see 16 bits of output. If you want just the bits, cast the sbyte to byte first, so you choose the (byte, int) overload:

Code:
sbyte val = 5;
Convert.ToString ((byte) val, 2);
That should give the correct answer.