我问这个问题是为了跟进我的previous question。
W3chools的页面上写着:
上面的例子使用了4位无符号二进制数字。因此,~5返回10。 因为JavaScript使用32位有符号整数,所以它不会返回10。 它会回来的-6。000000000000000000000000000000000101 (5) 11111111111111111111111111111010 (~5 = -6) 有符号整数使用最左边的位作为减号。
将比特反转并切断符号位,该数字变为1111111111111111111111111111010,以十进制形式计算为2147483642。然而,根据这一页,它应该评估为-6。
我哪里出错了?
发布于 2018-06-10 23:02:32
错误在于32位补充结果的“切掉符号位”。这将-6 (它的二进制表示中有很多前导1s )转换为一个31位正数,它的二进制表示法中仍然有很多前导1s。将符号位从-6中移除得到的31位数非常接近32位有符号数的最大值正值。
您可以在不删除32位整数符号位的情况下看到结果:
function unsignedNibble( i) {
return i & 0x0f;
}
function signedNumberBits( n) {
var bits = "";
for( var i = 32; i--;) {
bits = "" + (n&1) + bits;
n = n >> 1;
}
return bits;
}
console.log("Unsigned 4 bit: ");
var un5 = unsignedNibble( 5); // unsigned 4 bits of 5
console.log( "un5 = %s ( 0b%s)", un5, un5.toString(2));
var notUn5 = unsignedNibble( ~un5);
console.log( "~un5 = %s ( 0b%s)", notUn5, notUn5.toString(2));
console.log("Signed 32 bit: ");
var sn5 = 5; // signed number 5
console.log( "sn5 = %s ( 0b%s)", sn5, sn5.toString(2));
var notSn5 = ~sn5;
console.log( "~sn5 = %s ( 0b%s)", notSn5, signedNumberBits(notSn5));
发布于 2019-11-19 10:32:45
@wais
6表示为0000 0110 (0已填充)
现在,为了得到-6,我们必须使2的补充。
步骤1 -反转所有比特(第一补)
1111 1001
步骤2 - Add 1 (0000 0001)
1111 1001 + 0000 0001 = 1111 1010
发布于 2020-10-02 19:51:21
在2的恭维句中,在所有的位都被恭维后,在后面加1,以得到负数的绝对值。
1111111111111111111111010被恭维为得到...0101 (这是5),但接着你又加1得到6。记住这是一个负数,你就用一个负号来得到-6。
https://stackoverflow.com/questions/50788369
复制相似问题