int64 and uint64 are encoded the same way, with varint encoding: "If you use int32 or int64 as the type for a negative number, the resulting varint is always ten bytes long – it is, effectively, treated like a very large unsigned integer." (See https://developers.google.com/protocol-buffers/docs/encoding#signed-integers). In Java, this change has no effect. In languages that do support unsigned integers, this simplifies client code. Semantically, uint64 is more correct. On the wire, this change has no effect.
int64 and uint64 are encoded the same way, with varint encoding: "If you use int32 or int64 as the type for a negative number, the resulting varint is always ten bytes long – it is, effectively, treated like a very large unsigned integer." (See https://developers.google.com/protocol-buffers/docs/encoding#signed-integers). In Java, this change has no effect. In languages that do support unsigned integers, this simplifies client code. Semantically, uint64 is more correct. On the wire, this change has no effect.