proto3 has lists of value types: https://protobuf.dev/programming-guides/proto3/#scalar
Inside of them, fixed64
is a special type I’d like to check & test at here.
From its description:
Always eight bytes. More efficient than uint64 if values are often greater than 256.
Though it mentioned can be applied to C++ uint64
, it seems also works for int64
.
As it mentioned:
fixed32 is compatible with sfixed32, and fixed64 with sfixed64.
Now, here is one question, how will it be look like if we assign int64
to fixed64
?
To be more specifically, positive int64
will mapped to same value in fixed64
, how about negative int64
numbers?
==>
The “ZigZag” encoding instead of two’s complement to encode negative integers. Positive integers n are encoded as
2 * n
(the even numbers), while negative integers -n are encoded as2 * n + 1
(the odd numbers). The encoding thus “zig-zags” between positive and negative numbers.
Signed Original | Encoded As |
---|---|
0 | 0 |
-1 | 1 |
1 | 2 |
-2 | 3 |
… | … |
0x7fffffff | 0xfffffffe |
-0x80000000 | 0xffffffff |
Using some bit tricks, it’s cheap to convert n into its ZigZag representation:
((n + n) ^ -(n < 0)) - (n < 0)
Comments
Join the discussion for this article at here . Our comments is using Github Issues. All of posted comments will display at this page instantly.