Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

小心 Int32 溢出

  今天写个随机生成时间戳的程序,一如既往地使用按位或来取整,结果就呵呵了。程序看起来逻辑都正确,但生成的数据始终有问题,调试了好久才找出原因,原来是时间戳这个数值太大了,把 Int32 给玩坏了。大家引以为戒,写代码还是注意一下类型比较好。
  虽然 JavaScript 中没有显式的数值类型定义,但内部却有一套很完善的类型机制。比如我们创建数组的时候,参数就必须是 Uint32 范围内的,否则就直接抛异常。 <script>
new Array(Math.pow(2, 31)); // 正常工作
new Array(Math.pow(2, 32)); // 抛出异常
</script>
  对于按位运算符,它们的值域和定义域基本都在 Int32 类型的范围内(「>>>」运算符是 Uint32),超出也会自动补码。所以不能用它们来处理超出其能力范围的数据,比如时间戳。
<script>
var now = Date.now();
console.log(now); // 输出当前毫秒级时间戳
console.log(now | 0); // 由于溢出 Int32,自动补码,得到一个负数
</script>
  大家千万不要像我一样脑残到用按位运算符去处理毫秒级时间戳(虽然 Uint32 目前还真能容纳)。。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^