协议缓冲区负数int32 / int64编码器的规范是模糊的

时间:2015-02-16 01:07:44

标签: protocol-buffers

在协议缓冲区https://developers.google.com/protocol-buffers/docs/encoding的编码器规范中,可以说:

  

如果使用int32或int64作为负数的类型,则生成的varint总是十个字节长 - 实际上,它被视为一个非常大的无符号整数

好的,看起来不错,但是有一个10字节长的varint,你可以存储一个70位长的整数,类型是64位。因此,有6位未使用...这些位应设置为1还是0?

到summup,使用int32 / 64,-1应编码为

FF FF FF FF FF FF FF FF FF 7F

FF FF FF FF FF FF FF FF FF 01

1 个答案:

答案 0 :(得分:2)

64位及以上应为零。因此,在C ++中,您可以通过将int64转换为uint64来编码int64,然后像任何其他无符号整数一样编码(这实际上是Protobuf C ++库所做的)。请记住,int32需要符号扩展为64位。