已签署的二进制补码算术

5

我在思考数据类型的范围时,有一个问题。我们知道signed char的范围是从-128到127。我明白127是怎么来的,即0111111 = +127。

但我不明白-128是怎么来的?如果我们只打开符号位,我们得到11111111,它怎么等于-128?

4个回答

8
大多数情况下,计算机使用所谓的2's补码来表示有符号整数。2's补码的工作原理是,可能的值在一个巨大的循环中,从0到MAX_VALUE,再到MIN_VALUE,然后到零,以此类推。因此,最小值是最大值+1-01111111=127,而10000000=-128。这具有与无符号算术完全相同的良好属性——如果我想做-2 + 1,则使用所有与无符号加法相同的硬件,我有11111110 + 00000001 = 11111111 = -1。之所以在低端有一个额外的值,是因为我们选择让所有高位设置为负数,这意味着0从正数一侧减去了一个值。

2
值得指出的是,存在一种表示方法,其中11111111是最小可表示的数字,它确实是-127,这就是“符号-幅度”形式。在符号-幅度中,有两个零-一个+0和一个-0,分别为0000000010000000 - caf
@Asad Hanif,您需要更多的帮助吗?如果这个或其他答案对您有帮助并回答了您的问题,请不要忘记接受该答案。还可以参见“当答案被接受时意味着什么?”和“为什么投票很重要?” - Asif Raza

2

0

负数的符号位设置为1;-128是符号位被设置而其他位没有被设置的值(也就是最小的负数)。-128的二进制表示是10000000。对于其他数据长度,在二进制补码中,正确数量的0所得到的最小负数总是1000...


0

一个简单的思路是从01111111开始,然后不断减1直到它绕回来;前一个值就是最小的负数。使用标准的“借位”技术从00000000减去1会得到11111111,这确实是-1的二进制表示。我们可以一直减到10000000,即-128,再减1就又回到了01111111。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接