From 8a603ec41180085424d90a7913b4ffaaddb26774 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Fri, 27 Apr 2018 21:15:17 +0200 Subject: Using binary one's complement to negate an unsigned int This removes a Visual Studio warning C4146: unary minus operator applied to unsigned type, result still unsigned. Original code: https://github.com/google/protobuf/commit/24493eef9395e5b832360e12efabf9c363c9cb15 --- src/google/protobuf/wire_format_lite.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/google/protobuf/wire_format_lite.h b/src/google/protobuf/wire_format_lite.h index cf614c02..361920b8 100644 --- a/src/google/protobuf/wire_format_lite.h +++ b/src/google/protobuf/wire_format_lite.h @@ -860,7 +860,7 @@ inline uint32 WireFormatLite::ZigZagEncode32(int32 n) { inline int32 WireFormatLite::ZigZagDecode32(uint32 n) { // Note: Using unsigned types prevent undefined behavior - return static_cast((n >> 1) ^ -(n & 1)); + return static_cast((n >> 1) ^ (~(n & 1) + 1)); } inline uint64 WireFormatLite::ZigZagEncode64(int64 n) { @@ -871,7 +871,7 @@ inline uint64 WireFormatLite::ZigZagEncode64(int64 n) { inline int64 WireFormatLite::ZigZagDecode64(uint64 n) { // Note: Using unsigned types prevent undefined behavior - return static_cast((n >> 1) ^ -(n & 1)); + return static_cast((n >> 1) ^ (~(n & 1) + 1)); } // String is for UTF-8 text only, but, even so, ReadString() can simply -- cgit v1.2.3