有符号正数溢出变负问题
今天在学习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()
这个方法,具体的作用在以后的博客中会提到,这里先不多做解释
分析
- 首先,Int8Array.of(127, 126, 125)生成一个TypedArray实例,通过链式方式调用map做返回,map里将遍历的元素乘以2,得到了254,252,250
- 将它们转换为有符号二进制数依次为:
11111110
,11111100
,11111010
.可以看到最高位符号位都是1 - 而在有符号正数中,正数区间为:
0000 0001 ~ 0111 1111 (1~127)
,负数区间为1000 0000 ~ 1111 1111(-1~-127)
,因此这里返回的是负数 - -0 既(1000 0000)为-128
- 因此
11111110
,11111100
,11111010
可以对应转换为-2,-4,-6
所以在二进制的溢出计算中要注意有无符号,然后根据最高位判断正负,再从10000000 开始转换为对应的负数值
划重点
- 有符号正数中,正数区间为:
0000 0001 ~ 0111 1111 (1~127)
- 负数区间为
1000 0000 ~ 1111 1111(-1~-127)
- -0 既(1000 0000)为-128
如果对您的生活学习有帮助,不妨给小编点个赞再走呗~
网友评论