javascript中向左的位运算 1 << 31 为什么结果是33位?为什么是-2147483648而不是0?
1的二进制表示为00000000000000000000000000000001,
将其向左移动31位,空位用0填充,得到的结果为10000000000000000000000000000000。
这个结果是一个32位的二进制数,从左到右第一位为符号位,表示正负性。在JavaScript中,符号为1表示负数,所以这个32位二进制数表示的是-2147483648,而不是0。
闭包是在另一个函数(称为父函数)中定义的函数,并且可以访问在父函数作用域中声明和定义的变量。
闭包可以访问三个作用域中的变量:
var globalVar = "abc";
// 自调用函数
(function outerFunction (outerArg) { // outerFunction 作用域开始
// 在 outerFunction 函数作用域中声明的变量
var outerFuncVar = 'x';
// 闭包自调用函数
(function innerFunction (innerArg) { // innerFunction 作用域开始
// 在 innerFunction 函数作用域中声明的变量
var innerFuncVar = "y";
console.log(
"outerArg = " + outerArg + "
" +
"outerFuncVar = " + outerFuncVar + "
" +
"innerArg = " + innerArg + "
" +
"innerFuncVar = " + innerFuncVar + "
" +
"globalVar = " + globalVar);
// innerFunction 作用域结束
})(5); // 将 5 作为参数
// outerFunction 作用域结束
})(7); // 将 7 作为参数
innerFunction 是在 outerFunction 中定义的闭包,可以访问在 outerFunction 作用域内声明和定义的所有变量。除此之外,闭包还可以访问在全局命名空间中声明的变量。
上述代码的输出将是:
outerArg = 7
outerFuncVar = x
innerArg = 5
innerFuncVar = y
globalVar = abc
问题解答:
在Javascript中,左移运算符 “<<”将32位二进制数向左移动指定位数,左边空出来的部分用0填补,右边超出32位的部分则截取掉,得到的结果仍是一个32位的二进制数。比如,1 << 31 实际上是将二进制数“1”向左移动31位,右边用0填补,得到的结果为“10000000000000000000000000000000”,是一个32位的二进制数。
而为什么这个结果是负数 -2147483648,而不是正数0呢?这是因为在Javascript中,有符号整数使用二进制补码表示,并且范围是-2^31至2^31-1(32位),其中最高位表示符号位,0表示正数,1表示负数。而1 << 31 左移之后,最高位为1,表示负数。将这个32位的二进制数转换成十进制,需要把符号位去掉,然后求出真正的数值。由于这个数最高位为1,表示负数,因此要先将其取反(按位取反),然后再加1,得到的结果是“10000000000000000000000000000000”按位取反后是“01111111111111111111111111111111”,再加1后得到“10000000000000000000000000000000”,这就是-2147483648的二进制补码表示。
因此,1 << 31 的结果是一个32位的二进制补码表示的负数,即-2147483648。
代码示例:
无实际代码示例。