首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >~5怎么回-6?

~5怎么回-6?
EN

Stack Overflow用户
提问于 2018-06-10 21:50:27
回答 5查看 565关注 0票数 1

我问这个问题是为了跟进我的previous question

W3chools的页面上写着:

上面的例子使用了4位无符号二进制数字。因此,~5返回10。 因为JavaScript使用32位有符号整数,所以它不会返回10。 它会回来的-6。000000000000000000000000000000000101 (5) 11111111111111111111111111111010 (~5 = -6) 有符号整数使用最左边的位作为减号。

将比特反转并切断符号位,该数字变为1111111111111111111111111111010,以十进制形式计算为2147483642。然而,根据这一页,它应该评估为-6。

我哪里出错了?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-10 23:02:32

错误在于32位补充结果的“切掉符号位”。这将-6 (它的二进制表示中有很多前导1s )转换为一个31位正数,它的二进制表示法中仍然有很多前导1s。将符号位从-6中移除得到的31位数非常接近32位有符号数的最大值正值。

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

代码语言:javascript
复制
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));

票数 3
EN

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 2020-10-02 19:51:21

在2的恭维句中,在所有的位都被恭维后,在后面加1,以得到负数的绝对值。

1111111111111111111111010被恭维为得到...0101 (这是5),但接着你又加1得到6。记住这是一个负数,你就用一个负号来得到-6。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50788369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档