签署了二进制补码算法

我正在考虑数据类型范围,出现了一个问题。 我们知道签名char的范围是从-128到127.我得到了127的结果,即0111111 = +127

但我无法得到-128如何来? 如果我们只是ON符号位,我们得到11111111,它是如何等于-128?

大多数情况下,计算机使用所谓的2的补码来表示有符号整数。

2的补码方式是可能的值在一个巨大的循环中,从0到MAX_VALUE,到MIN_VALUE,到零,依此类推。

因此,最小值是最大值+1 – 01111111 = 127 ,并且10000000 = -128

这具有与无符号算术完全相同的良好属性 – 如果我想做-2 + 1 ,我有11111110 + 00000001 = 11111111 = -1 ,使用与无符号加法相同的硬件。

低端有一个额外值的原因是我们选择将高位设置的所有数字都设为负数,这意味着0取值为正值。

在二进制补码中 ,-128是10000000。

负数将符号位设置为1; -128是设置符号位但没有其他位的值(即,它是最小的负数)。 -128的二进制表示为10000000 。 对于其他数据长度,二进制补码中的最小负数始终为1000...对于正确的零数。

想到这一点的一个简单方法是从01111111开始,然后继续减去1,直到它回绕; 前一个值是最小的负值。 使用标准“借用”技术从00000000减去1得到11111111,这实际上是-1的二进制表示。 我们可以继续减去10000000,即-128,然后再减去一个产量01111111,包围。