搜索
Javascript: 位操作中的溢出和负数
天蓬老师
天蓬老师 2017-04-10 12:43:47
[JavaScript讨论组]

本来遇到的问题是如何在Javascript中将十进制转变为十六进制(http://segmentfault.com/q/10100000000...)
第一次回答时我使用了这种方案:

var dec2hex = function(dec) {
  var buf = [],
  map = '0123456789ABCDEF';
  while (parseInt(dec / 16, 10) !== 0) {
    buf.unshift(map[dec % 16]);
    dec = parseInt(dec / 16, 10);
  }
  buf.unshift(map[dec % 16]);
  return buf.join('');
};

而在另一个我提出的问题中(http://segmentfault.com/q/10100000001...),我突然意识到还可以通过另一种方式进行转换:

var dec2hex2 = function(dec) {
  var hex = [],
  HEX = '0123456789ABCDEF';
  do {
    hex.unshift(HEX[dec & 0xF]);
  } while ( (dec = dec >> 4) !== 0 );
  return hex.join('');
};

知道最后google,我才发现原来事实比我想象的要简单得多。

var dec2hex3 = function(dec) {
  return dec.toString(16);
};

然而,问题来了。

第一次测试

输入:

var num = 542352345;
console.log(dec2hex(num));
console.log(dec2hex3(num));
console.log(dec2hex2(num));

输出:

2053A3D9
2053a3d9
2053A3D9

一切正常。

第二次测试

输入:

var num = 34542352345;
console.log(dec2hex(num));
console.log(dec2hex3(num));
console.log(dec2hex2(num));

输出:

80AE277D9
80ae277d9
AE277D9

Seemed weird?

第三次测试

输入:

var num = 5234542352345;
console.log(dec2hex(num));
console.log(dec2hex3(num));
console.log(dec2hex2(num));

输出:

4C2C30997D9
4c2c30997d9

这时候,dec2hex2函数似乎一直在运行,没有结果输出。

事先声明上述数字纯粹是我瞎打的。这时候我的第一个反应,是不是因为数字已经超过了32位(因为我的机器是32位的),然而我做了另外一个实验。
输入:

var num = parseInt(0xFFFFFFFF, 16);
console.log(dec2hex(num));
console.log(dec2hex3(num));
console.log(dec2hex2(num));

输出:

4294967295
4294967295

此时发生了和第三次测试同样的情况。

请问这是怎么回事呢?是不是发生了数字的溢出?那么如何避免和处理呢?

可能相关的资料(不确定)

https://dev.twitter.com/docs/twitter-...

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(1)
迷茫

关键在于dec2hex2里用到的位移运算符。在ECMA规范中,位运算符总是针对32bit的整数进行的操作。至于死循环,是因为位移的时候会保留符号位。那个数字的bit32正好是1,所以一直右移最后得到的总是0xFFFFFFFF。

In ECMAScript (Javascript) bitwise operations are always in 32-bit. Therefore 5799218898 is chopped into 32-bit which becomes 1504251602. This integer >> 13 gives 183624.

Ref: http://stackoverflow.com/questions/23...

p.s. 建议,除非必要,避免使用位移运算符。你能想到的简单优化,编译器也很容易做到。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号