为什么-1在内部表示为全1' s

时间:2014-09-23 19:52:48

标签: c integer negative-number

为什么-1在内部表示为16位编译器中的全1? 这用于解决以下程序:

main()
{
    printf("%x",-1<<4);
}

我不明白这个问题的解决方案。请帮忙。 谢谢:))

4 个答案:

答案 0 :(得分:3)

有符号整数表示为“二进制补码”。

当数字为正时,您将按预期使用二进制表示。

当它为负时,它被表示为两个补码。 k的两个补码,其中k具有N位,是2 ^ N-k。由于2 ^ N是一位后跟k-1零, 你有,例如,

k = -3

N = 4(4位,2 ^ N = 16)

然后-3表示为

16 - 3 = 13,二进制为1101

然后您可以看到-1表示为

16 - 1 = 15,二进制为1111

因此,如果内部表示是2的补码,则数字-1将始终表示为1的序列。

下表显示了4位整数的表示。否定词代表两个补语。

REPR   N
----  --
0111   7
0110   6
0101   5
0100   4
0011   3
0010   2
0001   1
0000   0
1111  -1
1110  -2
1101  -3
1100  -4
1011  -5
1010  -6
1001  -7
1000  -8

如果你正在使用一个补码,那么你有三位数字和一个符号, 所以表格将是

REPR   N
----  --
0111   7
0110   6
0101   5
0100   4
0011   3
0010   2
0001   1
0000   0
1000   0
1001  -1
1010  -2
1011  -3
1100  -4
1101  -5
1110  -6
1111  -7

为什么我们使用2的补码?好吧,看看有一个补码你有两个零的表示(我们没有,在2的补码)。除此之外,您可以在二进制补码中添加数字(负数或正数),结果也是正确的。

使用两个补码的一个缺点是你不能代表abs(INT_MIN)

有关the Wikipedia article

中两个补码的更多信息

答案 1 :(得分:1)

有符号二进制数使用所谓的二进制补码。查看维基百科页面:http://en.wikipedia.org/wiki/Twos_complement 如果有帮助,可将其视为代表-65536 + x。

答案 2 :(得分:1)

signed int x的两个补码表示:

  • 如果x的最重要位为0,则只需按x“表示的值”。

  • 如果x的最重要位为1,则计算x所代表的值,如下所示:

    • 翻转所有位
    • 在结果中添加1
    • 将结果视为否定

答案 3 :(得分:1)

-1存储为全1,因为它是二进制补码表示法。

使用二进制补码表示法有多种原因,其中一些原因包括:

  • 处理负数时无需特殊逻辑
  • 没有浪费的比特(正0和负0)