According to the spec, varint should do:
<= 0xffff 3 0xfd + uint16_t
So what it seems to do is only setting the total value in the next two bytes without subtracting 253 of it.
The mainstream client is the only spec that matters at the moment. From serialize.h
void WriteCompactSize(Stream& os, uint64 nSize)
if (nSize < 253)
unsigned char chSize = nSize;
else if (nSize <= USHRT_MAX)
unsigned char chSize = 253;
unsigned short xSize = nSize;
So yes, small numbers have multiple representations.