This is an automated email from the ASF dual-hosted git repository.

colinlee pushed a commit to branch fix_store_minus_num
in repository https://gitbox.apache.org/repos/asf/tsfile.git

commit 0eb48f885b76ac33376e015e1eae7e42a02b7e4d
Author: ColinLee <[email protected]>
AuthorDate: Wed Jun 11 18:23:23 2025 +0800

    fix minus encode and decode.
---
 cpp/src/common/allocator/byte_stream.h | 10 ++++++++--
 cpp/test/encoding/plain_codec_test.cc  | 22 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/cpp/src/common/allocator/byte_stream.h 
b/cpp/src/common/allocator/byte_stream.h
index f5534d7a..78366345 100644
--- a/cpp/src/common/allocator/byte_stream.h
+++ b/cpp/src/common/allocator/byte_stream.h
@@ -1005,8 +1005,11 @@ class SerializationUtil {
     FORCE_INLINE static int write_var_int(int32_t i32, ByteStream &out) {
         // TODO 8byte to 4byte.
         // but in IoTDB java, it has only write_var_uint(i32)
-        i32 = i32 << 1;
-        return do_write_var_uint((uint32_t)i32, out);
+        int ui32 = i32 << 1;
+        if (i32 < 0) {
+            ui32 = ~ui32;
+        }
+        return do_write_var_uint(static_cast<uint32_t>(ui32), out);
     }
     FORCE_INLINE static int read_var_int(int32_t &i32, ByteStream &in) {
         int ret = common::E_OK;
@@ -1014,6 +1017,9 @@ class SerializationUtil {
         if (RET_FAIL(do_read_var_uint(ui32, in))) {
         } else {
             i32 = (int32_t)(ui32 >> 1);
+            if ((ui32 & 1) != 0) {
+                i32 = ~i32;
+            }
         }
         return ret;
     }
diff --git a/cpp/test/encoding/plain_codec_test.cc 
b/cpp/test/encoding/plain_codec_test.cc
index 0c46d944..a51fa926 100644
--- a/cpp/test/encoding/plain_codec_test.cc
+++ b/cpp/test/encoding/plain_codec_test.cc
@@ -49,6 +49,28 @@ TEST(PlainEncoderDecoderTest, EncodeDecodeInt32) {
     EXPECT_EQ(original, decoded);
 }
 
+TEST(PlainEncoderDecoderTest, EncodeDecodeMinusInt32) {
+    PlainEncoder encoder;
+    PlainDecoder decoder;
+    common::ByteStream stream(1024, common::MOD_DEFAULT);
+    int32_t original = -12345333;
+    int32_t decoded = 0;
+    encoder.encode(original, stream);
+    decoder.read_int32(decoded, stream);
+    EXPECT_EQ(original, decoded);
+}
+
+TEST(PlainEncoderDecoderTest, EncodeDecodeMinusInt64) {
+    PlainEncoder encoder;
+    PlainDecoder decoder;
+    common::ByteStream stream(1024, common::MOD_DEFAULT);
+    int64_t original = -12345333;
+    int64_t decoded = 0;
+    encoder.encode(original, stream);
+    decoder.read_int64(decoded, stream);
+    EXPECT_EQ(original, decoded);
+}
+
 TEST(PlainEncoderDecoderTest, EncodeDecodeInt64) {
     PlainEncoder encoder;
     PlainDecoder decoder;

Reply via email to