JS 整数是怎么表示的?
面试速答(30 秒版 TL;DR)
- JS 里主流的数值类型是
number,底层是 IEEE 754 双精度浮点,所以“整数”和“小数”都用同一种格式表示。 number能精确表示的整数范围是-(2^53 - 1)到2^53 - 1,超过就可能丢精度。- 位运算(
| & ^ << >> >>>)会把number转成 32 位整数再运算,这是另一套规则,面试经常追问。
number 的位布局(面试说清楚就够)
IEEE 754 双精度:
尾数只有 52 位(再加上隐含的 1),决定了它能精确表示的整数位数是有限的。
为什么“安全整数”上限是 2^53 - 1?
你可以这样解释:
- 浮点数用“尾数”存有效数字。
- 双精度有效二进制位大约是 53 位(52 位 fraction + 隐含 1)。
- 所以当整数需要超过 53 位来表达时,相邻整数之间的间隔会变大,导致“+1”可能没变化。
Number.MAX_SAFE_INTEGER; // 9007199254740991 = 2^53 - 1
Number.isSafeInteger(Number.MAX_SAFE_INTEGER); // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1); // false
位运算为什么只剩 32 位?
JS 的位运算会做一步隐式转换(面试关键点):
ToInt32/ToUint32:把number截断到 32 位整数范围再运算
常见现象:
2147483647 | 0; // 2147483647
2147483648 | 0; // -2147483648(溢出到有符号 32 位)
3.9 | 0; // 3(截断)
结论:位运算适合做 32 位范围内的技巧(比如掩码),不适合处理大整数精度问题。
典型题 & 标准答法
Q1:JS 有“整数类型”吗?
- 语言层面没有单独的
int,整数只是number的一种取值形态。 - 需要更大整数或精确整数运算时,用
BigInt。
Q2:怎么判断一个 number 是不是安全整数?
Number.isSafeInteger(x);
易错点/坑
parseInt不是“转整数”万能工具,建议用Number()或显式校验。- 用位运算“取整”会强制到 32 位,超过范围会溢出。
速记要点(可背诵)
number是 IEEE 754 双精度;安全整数上限2^53 - 1。- 位运算会转 32 位整数;大整数用
BigInt。