JS ArrayBuffer溢出问题(有符号正数溢出问题)

有符号正数溢出变负问题

今天在学习ES6的ArrayBuffer的时候遇到了一个问题,让我对有符号正数溢出有了新认识.下面给大家看一下


	//这里溢出了
	Int8Array.of(127, 126, 125).map(x => 2 * x)
	//这里没有溢出,因为遍历不是针对原来的8位数组,而是将其拷贝到另一段内存中处理后再将结果转换为指定的数组格式
	// Int8Array [ -2, -4, -6 ]
	Int16Array.from(Int8Array.of(127, 126, 125), x => 2 * x)
	// Int16Array [ 254, 252, 250 ]

这道题利用了TypedArray.of()这个方法,具体的作用在以后的博客中会提到,这里先不多做解释

分析
  1. 首先,Int8Array.of(127, 126, 125)生成一个TypedArray实例,通过链式方式调用map做返回,map里将遍历的元素乘以2,得到了254,252,250
  2. 将它们转换为有符号二进制数依次为:11111110,11111100,11111010.可以看到最高位符号位都是1
  3. 而在有符号正数中,正数区间为:0000 0001 ~ 0111 1111 (1~127),负数区间为1000 0000 ~ 1111 1111(-1~-127),因此这里返回的是负数
  4. -0 既(1000 0000)为-128
  5. 因此11111110,11111100,11111010可以对应转换为-2,-4,-6

所以在二进制的溢出计算中要注意有无符号,然后根据最高位判断正负,再从10000000 开始转换为对应的负数值

划重点
  1. 有符号正数中,正数区间为:0000 0001 ~ 0111 1111 (1~127)
  2. 负数区间为1000 0000 ~ 1111 1111(-1~-127)
  3. -0 既(1000 0000)为-128

如果对您的生活学习有帮助,不妨给小编点个赞再走呗~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值