我在计算一些校验和时遇到了奇怪的现象。所以我把这个问题简化成小脚本。
% node
Welcome to Node.js v16.1.0.
Type ".help" for more information.
> console.log( ( 0x20000026c6db24 + 0x8bf8a215 ).toString( 16 ) )
200000b2bf7d38
在 Safari 和 Chrome 中。
<script>
console.log( ( 0x20000026c6db24 + 0x08bf8a215 ).toString( 16 ) )
</script>
Browser's console
200000b2bf7d38
我认为它必须是 200000b2bf7d39。请告诉我为什么这个计算结果是 200000b2bf7d38。
答案 0 :(得分:2)
这是因为您使用了错误的类型。 JS Number 不能被视为定点数或浮点数。但是如此大的数字0x20000026c6db24 > Number.MAX_SAFE_INTEGER
不能安全地用于定点计算的上下文中。
但是 BigInt
可以显式使用:
(BigInt('0x20000026c6db24') + BigInt('0x8bf8a215')).toString(16) // '200000b2bf7d39'
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/BigInt