签了两个补码算术

时间:2011-02-09 03:52:16

标签: c types

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

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

4 个答案:

答案 0 :(得分:8)

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

2的补码方式是可能的值是一个巨大的循环,从0到MAX_VALUE,到MIN_VALUE,到零,等等。

因此,最小值是最大值+1 - 01111111 = 12710000000 = -128

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

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

答案 1 :(得分:2)

two's complement中,-128是10000000。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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