国际象棋棋盘放麦粒的故事都听过:第一格1粒,后面每格翻倍,放到第64格棋盘已经装不下,全部加起来正好是它再减1粒,写出来是18446744073709551615,接近1.8乘10的19次方。至于全球小麦产量够不够付,说法不一,反正是天文数字。

精确答案记住这个就行:2的64次方 = 18446744073709551616,读作约1844亿亿。64位无符号整数的上限就是2的64次方减1,也就是18446744073709551615。

它经常出现在哪些地方

  • 64位CPU的地址空间理论上限是2的64次方字节,约16EB,现实硬件远远用不满
  • C语言的unsigned long long,上限18446744073709551615
  • MySQL的BIGINT UNSIGNED,上限同上,自增主键真用到头就是这个数
  • UUID和IPv6是128位,比它大得多,别记混

计算器和JS里都会踩坑

Windows计算器切到程序员模式,选QWORD位宽再用x的y次方那个按钮,能直接出精确结果。手机科学计算器找幂运算符号同样能按出来。真正容易翻车的是JavaScript:安全整数上限只有2的53次方减1,超过就丢精度,直接算2的64次方会得到一个约数而不是精确值。

解决办法是用BigInt,写2n ** 64n就能得到精确的18446744073709551616n。平时判断一个数会不会溢出,记两个门槛:有符号64位到9223372036854775807,无符号到18446744073709551615,超过就该换BigInt或者干脆用字符串存。

记不住19位数就记量级

2的10次方约一千,2的20次方约一百万,2的60次方约10的18次方,再乘16倍就到1.8乘10的19次方。工程上估容量、估自增ID还能用多久,用这套近似足够,面试背精确数反而容易卡壳。