Javascript ~5如何返回-6?

Javascript ~5如何返回-6?,javascript,bitwise-operators,representation,Javascript,Bitwise Operators,Representation,我问这个问题是为了跟进我的调查 W3chools的页面上写着: 上面的示例使用4位无符号二进制数。因此~5返回10 因为JavaScript使用32位有符号整数,所以它不会返回10 它将返回-6。000000000000000000000000101(5) 11111111111111111010(~5=-6) 有符号整数使用最左边的位作为减号 反转位并切掉符号位,数字变为1111111111010,以十进制形式计算为2147483642。然而,根据页面,它的计算结果应该是-6 哪里出错了?错误

我问这个问题是为了跟进我的调查

W3chools的页面上写着:

上面的示例使用4位无符号二进制数。因此~5返回10

因为JavaScript使用32位有符号整数,所以它不会返回10

它将返回-6。000000000000000000000000101(5)

11111111111111111010(~5=-6)

有符号整数使用最左边的位作为减号

反转位并切掉符号位,数字变为1111111111010,以十进制形式计算为2147483642。然而,根据页面,它的计算结果应该是-6

哪里出错了?

错误在于32位补码结果的“截断符号位”。这将-6(在其二进制表示中有许多前导1)转换为31位正数,该正数在其二进制表示中仍然有许多前导1。通过从-6中删除符号位获得的31位数字非常接近32位有符号数字的最大正值

您可以在不删除32位整数符号位的情况下查看结果:

函数unsignedNibble(i){
返回i&0x0f;
}
函数signedNumberBits(n){
var位=”;
对于(变量i=32;i--;){
位=”“+(n&1)+位;
n=n>>1;
}
返回位;
}
log(“无符号4位:”);
var un5=无符号字节(5);//5的无符号4位
console.log(“un5=%s(0b%s)”,un5,un5.toString(2));
var notUn5=无符号nibble(~un5);
console.log(“~un5=%s(0b%s)”,notUn5,notUn5.toString(2));
log(“签名32位:”);
变量sn5=5;//签名号码5
console.log(“sn5=%s(0b%s)”,sn5,sn5.toString(2));
var notSn5=~sn5;

console.log(“~sn5=%s(0b%s)”,notSn5,signedNumberBits(notSn5))~运算符只需更改位即可

例如~5=~(00000101),它返回(11111010)=-6

不要把~操作符弄得太复杂。

@wais

6表示为0000 0110(0已填充)

现在要得到-6,我们必须对它进行2的补码

步骤1-反转所有位(第一个补码)

11111001

第2步-添加1(0000 0001)


1111 1001+0000 0001=1111 1010

在2的补充中,在所有位被补充后的末尾加1以获得负数的绝对值


111111111111111101010是恭维得到…0101(也就是5),但你加1得到6。记住这是一个你正在确定的负数,你在上面打上负号得到-6。

JavaScript二进制数以2的补码格式存储

这意味着负数是数字加1的按位NOT。例如:

Binary Representation               Decimal value
00000000000000000000000000000101      5
11111111111111111111111111111011     -5
00000000000000000000000000000110      6
11111111111111111111111111111010     -6
00000000000000000000000000101000     40
11111111111111111111111111011000    -40

来源:

2的补码??11111010如何等于-6的可能重复?这并不能回答问题。