varint 如何减少 space?

How do varints take less space?

我正在尝试了解 varint,我发现的最好的东西是 Google Protocol Buffers spec

在他们的示例中,他们表明这个数字 1010 1100 0000 0010 在使用 varints 编码时是 300 而不是 44034.

通常数字 300 占用两个字节 (1 0010 1100),但在他们的示例中,300 也是如此。 varints实际上比普通ints占用更少的字节?

300 通常占用两个字节,如果您使用 2 字节的固定格式 来表示它。如果您使用的是 4 字节或 8 字节格式,则需要 4 个字节或 8 个字节。如果您使用的是 1 字节格式,则根本无法表示 300,除非您使用的是非常奇怪的编码。

如果您想使用可变长度编码,那么标准的 2 的补码表示是不够的,因为它没有长度信息。您不会知道数字 在何处停止 。您可以单独编码长度,但这会增加您的 space 要求......或者您可以使用类似 protobuf varint 表示的东西,它可以在 2 个字节中表示 300 包括表示此时数字已完成的信号。

(或者您可以使用许多其他编码中的一种。Protobuf varints 并没有明确优于其他表示,即使就使用的 space 而言也是如此。总是要权衡取舍。)