Abseil库中128位整数如何构成?MakeUint128参数是何含义?
absl::uint128 构成规则与absl::MakeUint128参数含义 absl::MakeUint128的两个入参分别对应128位无符号整数拆分出的两个64位分段,函数签名的语义等价于:
absl::uint128 MakeUint128(uint64_t high, uint64_t low);
两个参数的具体含义:
- 第一个参数
high:128位整数的高64位,每一位的权重是2^64 - 第二个参数
low:128位整数的低64位,每一位的权重是2^0
完整128位数值的计算公式非常直白:
最终值 = (static_castabsl::uint128(high) << 64) | low
你提到的代码absl::uint128 big = absl::MakeUint128(1, 0);代入公式计算就是:(1 << 64) | 0 = 2^64,和你观察到的结果完全一致。
底层实现逻辑
Abseil的absl::uint128没有强制依赖编译器原生128位支持,本质是两个连续存储的64位无符号整数的包装结构体:
- 内存布局和原生整数的小端存储规则对齐:低地址存低64位
low,高地址存高64位high - 所有算术运算、位运算、比较运算都是手动基于两个64位分段实现,比如加法进位、减法借位的判断,都是先操作低64位,再把进位/借位值传递到高64位计算。
常见取值参考
absl::MakeUint128(0, 0):数值0absl::MakeUint128(0, UINT64_MAX):数值2^64 - 1,也就是64位无符号整数能表示的最大值absl::MakeUint128(1, UINT64_MAX):数值2^64 + (2^64 -1) = 2^65 -1absl::MakeUint128(UINT64_MAX, UINT64_MAX):128位无符号整数最大值2^128 - 1
内容的提问来源于stack exchange,提问作者Anuj
相关产品推荐
相关产品推荐

