You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中复现Solidity指定大小整数转换与位运算逻辑

JavaScript复现Solidity位运算拼接函数方案

问题根因

  • JavaScript 原生位运算符默认将操作数转换为32位有符号整数处理,左移64位会直接溢出32位范围导致计算错误
  • 普通JavaScript Number类型是双精度浮点数,最大安全整数仅为2^53-1,你需要的计算结果远超这个阈值,会出现精度丢失

正确实现

使用ES6新增的BigInt类型处理大整数运算,所有参与位运算的数值都需要转换为BigInt类型:

function addPhase(_phase, _originalId) {
  // 入参如果是普通数字先转BigInt
  const phase = BigInt(_phase);
  const originalId = BigInt(_originalId);
  // 按Solidity逻辑运算,返回BigInt类型,也可以按需转成字符串
  return (phase << 64n) | originalId;
}

// 测试示例
console.log(addPhase(1, 5132).toString()) 
// 输出:18446744073709556748,和Solidity运行结果完全一致

注意事项

  • 运算结果如果需要传入web3相关接口,现在主流的web3.js、ethers库都已支持直接传入BigInt类型,也可以调用toString()方法转成十进制字符串、或者toString(16)转成十六进制字符串使用
  • 不要将计算结果转为普通Number类型,否则会出现精度丢失

内容的提问来源于stack exchange,提问作者Harry Papacharissiou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:30:01