如何让boost::multiprecision::int256_t正确解析补码形式十六进制负数
解决方法
问题根因
boost::multiprecision::int256_t 从十六进制字符串构造实例时,默认会将输入的十六进制值按无符号正整数解析,不会主动将最高位为1的输入识别为补码形式的负数,因此才会输出你看到的超大正整数值。
修复方案
你可以先将十六进制字符串解析为无符号的 uint256_t 类型,再强制转换为有符号的 int256_t,这个转换过程会自动遵循补码规则识别正负值,修改后的代码如下:
#include <iostream> #include <boost/multiprecision/cpp_int.hpp> int main(int argc, char* argv[]) { std::string hex_str = "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2e"; // 先解析为无符号256位整数 boost::multiprecision::uint256_t unsigned_int(hex_str); // 强制转换为有符号类型,自动按补码处理 boost::multiprecision::int256_t signed_int = static_cast<boost::multiprecision::int256_t>(unsigned_int); std::cout << signed_int << std::endl; }
运行上述代码即可输出你预期的 -1234。
内容的提问来源于stack exchange,提问作者Thomas Johnson
相关产品推荐
相关产品推荐

