Varint — переменная длина для целых чисел. Каждый байт использует 7 бит для данных и 1 бит (MSB) как continuation flag. Число 1 = один байт (0x01). Число 300 = два байта. Маленькие числа компактны, большие занимают больше. Для отрицательных чисел обычный varint плох (всегда 10 байт), поэтому есть sint32/sint64 с ZigZag encoding: 0→0, -1→1, 1→2, -2→3 — маленькие отрицательные тоже компактны. В protobuf int32 используй для положительных, sint32 — если бывают отрицательные. Это влияет на размер сообщений.