在分析Avro源码时,发现Avro为了对int.long类型数据压缩,采用Protocol Buffers的ZigZag编码(Thrift也采用了ZigZag来压缩整数). 1. 补码编码 为了便于后面的分析,我们先回顾下几个概念: 原码:最高位为符号位,剩余位表示绝对值: 反码:除符号位外,对原码剩余位依次取反: 补码:对于正数,补码为其自身:对于负数,除符号位外对原码剩余位依次取反然后+1. 补码解决了原码中\(0\)存在两种编码的问题: \[ 0=[0000 \enspace 0000]_…