我在思考数据类型的范围时,有一个问题。我们知道signed char的范围是从-128到127。我明白127是怎么来的,即0111111 = +127。
但我不明白-128是怎么来的?如果我们只打开符号位,我们得到11111111,它怎么等于-128?
负数的符号位设置为1;-128
是符号位被设置而其他位没有被设置的值(也就是最小的负数)。-128
的二进制表示是10000000
。对于其他数据长度,在二进制补码中,正确数量的0所得到的最小负数总是1000...
。
一个简单的思路是从01111111开始,然后不断减1直到它绕回来;前一个值就是最小的负数。使用标准的“借位”技术从00000000减去1会得到11111111,这确实是-1的二进制表示。我们可以一直减到10000000,即-128,再减1就又回到了01111111。
11111111
是最小可表示的数字,它确实是-127,这就是“符号-幅度”形式。在符号-幅度中,有两个零-一个+0
和一个-0
,分别为00000000
和10000000
。 - caf