Protocol Buffers - 为什么 int32 和 sint32 以相同的方式映射?

Protocol Buffers - Why int32 and sint32 are mapped in the same way?

在Protocol Buffers中,有几种int类型。例如,对于32位的int,有int32、sint32和uint32。

文档中解释了差异(参见 https://developers.google.com/protocol-buffers/docs/proto3#scalar),但我不明白为什么 int32 和 sint32 以相同的方式映射。它们实际上映射到 ::google::protobuf::int32,所以最终没有区别,是吗?

谢谢。

内存表示相同,但​​编码不同。 int32 使用 varint 而 sint32 使用 zig-zag varint。因为 varint 对于负整数是出了名的不好。

例如,

memory value -> encoded value
int32 5 -> varint 5
int32 -5 -> varint -5
sint32 5 -> varint 10
sint32 -5 -> varint 9

阅读更多: https://developers.google.com/protocol-buffers/docs/encoding