为什么-1在内部表示为16位编译器中的全1? 这用于解决以下程序:
main()
{
printf("%x",-1<<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)
。
答案 1 :(得分:1)
有符号二进制数使用所谓的二进制补码。查看维基百科页面:http://en.wikipedia.org/wiki/Twos_complement 如果有帮助,可将其视为代表-65536 + x。
答案 2 :(得分:1)
signed int x
的两个补码表示:
如果x
的最重要位为0,则只需按x
“表示的值”。
如果x
的最重要位为1,则计算x
所代表的值,如下所示:
答案 3 :(得分:1)
-1存储为全1,因为它是二进制补码表示法。
使用二进制补码表示法有多种原因,其中一些原因包括: