跳到主要内容

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