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

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

本文关键字:方式 映射 sint32 缓冲区 为什么 int32 协议      更新时间:2023-10-16

在协议缓冲区中,有几种整数类型。例如,对于 32 位 int,有 int32、sint32 和 uint32。

在文档中解释了差异(请参阅 https://developers.google.com/protocol-buffers/docs/proto3#scalar),但我不明白为什么int32和sint32以相同的方式映射。它们实际上映射到 ::google::p rotobuf::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