协议缓冲区 - 为什么int32和sint32以相同的方式映射?

时间:2017-01-11 09:21:19

标签: c++ int mapping buffer protocols

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

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

谢谢。

1 个答案:

答案 0 :(得分:4)

内存表示相同,但​​编码不同。 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