【发布时间】:2019-12-03 12:17:27
【问题描述】:
假设我们正在处理的环境只能存储 32 位有符号整数范围内的整数:[−231, 231 - 1]。为了解决这个问题,假设你的函数在反转整数溢出时返回 0。
我遇到的问题是如何知道一个数字大于整数范围。 (对不起我的英语)
【问题讨论】:
标签: javascript numbers int
假设我们正在处理的环境只能存储 32 位有符号整数范围内的整数:[−231, 231 - 1]。为了解决这个问题,假设你的函数在反转整数溢出时返回 0。
我遇到的问题是如何知道一个数字大于整数范围。 (对不起我的英语)
【问题讨论】:
标签: javascript numbers int
您可以从Signed 32-bit integers 获取值并检查范围。
function getValue(v) {
return v < -2147483648 || v > 2147483647
? 0
: v;
}
console.log(getValue(1));
console.log(getValue(1e20));
【讨论】:
由于 JavaScript 的数字不是整数(并且具有很多更广泛的范围),您只需将结果与所需范围进行比较:
if (result < -(2**31) || result > (2**31) - 1) {
// Out of range
}
(** 是新的求幂运算符。对于较旧的 JavaScript 引擎,您可以改用 -Math.pow(2, 31) 和 Math.pow(2, 31) - 1。当然,也可以提前计算:-2147483648 和 2147483647。)
或者,假设您的结果不是小数(它是一个整数),您可以让 JavaScript 使用按位运算符将其转换为 32 位有符号整数,并查看您是否仍然有相同的数字:
if (result !== result|0) {
// Out of range
}
这是有效的,因为按位 | 运算符将其两个操作数都转换为 32 位有符号整数,执行按位 OR 运算,然后将结果转换回数字。因此,如果超出范围,您将无法返回相同的数字。
【讨论】: