Web 技术研究所

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

位运算符溢出问题

  看到有人在喷 left-pad 的同时用位运算符装了一波逼,感觉又要出现一个装逼失败的悲剧了。说起位运算符,我以前老是用它做一些取整之类的事情,感觉逼格很高,而且写法简单,就连性能也比其他方式高。直到我膝盖中了一箭后就不敢再拿位运算符装逼了,用之前还是得三思而行。
  虽然这个问题之前也写过一篇「小心 Int32 溢出」,但既然又有人膝盖中箭了就不得不再喷一波。
  在 ES5/ES6 中,位运算符都是 32 位的。而且大部分位运算符是有符号的,只有「>>>」是无符号的。而且规范中定义的 ToInt32ToUint32 是取余来得到结果的,所以只是溢出的部分被丢掉,没有溢出的部分构成另一个数字。而且这些运算符是在执行运算之前,对操作数执行 32 位转换的,而不是对结果操作,所以下面的表达式可能不是预料内的结果
0b100000000000000000000000000000010 >>> 1; /** 结果并不是: 0b10000000000000000000000000000001 */   实际的执行过程是先把操作数 ToUint32,取余丢到溢出的位得到 0b10,然后再执行 >>> 1 得到 1。
  很多人可能会觉得,32 位已经非常大了,转成十进制有 4294967295 这么多。虽然数字看上去挺大,其实才 4GB 而已。完全是可以达到的数量级,所以对于这种可预估的临界问题,还是避免埋坑比较好。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^