【发布时间】:2011-06-23 21:23:01
【问题描述】:
我在考虑数据类型范围时,出现了一个问题。 我们知道有符号字符的范围是 -128 到 127。 我知道 127 是怎么来的,即 0111111 = +127
但我不明白 -128 是怎么来的? 如果我们只是打开符号位,我们得到 11111111,它是如何等于 -128 的?
【问题讨论】:
我在考虑数据类型范围时,出现了一个问题。 我们知道有符号字符的范围是 -128 到 127。 我知道 127 是怎么来的,即 0111111 = +127
但我不明白 -128 是怎么来的? 如果我们只是打开符号位,我们得到 11111111,它是如何等于 -128 的?
【问题讨论】:
大多数时候,计算机使用所谓的2的补码来表示有符号整数。
2 的补码的工作方式是,可能的值处于一个巨大的循环中,从 0 到 MAX_VALUE,到 MIN_VALUE,再到零等等。
所以最小值是最大值+1 - 01111111 = 127,和10000000 = -128。
这具有与无符号运算完全相同的良好特性 - 如果我想做-2 + 1,我有11111110 + 00000001 = 11111111 = -1,使用与无符号加法相同的硬件。
低端有额外值的原因是我们选择将所有高位设置为负数,这意味着 0 会从正数一侧取走一个值。
【讨论】:
11111111 是最小可表示数字,它确实是-127 - 这是“符号幅度”形式。在符号大小中,有两个零 - 分别是 +0 和 -0、00000000 和 10000000。
在two's complement 中,-128 是 10000000。
【讨论】:
负数的符号位设置为 1; -128 是设置了符号位但没有其他位的值(即,它是最小的负数)。 -128 的二进制表示是 10000000。对于其他数据长度,二进制补码中最小的负数始终为1000...,以表示正确的零数。
【讨论】:
一种简单的思考方法是从 01111111 开始,然后不断减 1 直到它回绕;前一个值是最小的负值。使用标准“借用”技术从 00000000 中减去 1 得到 11111111,这确实是 -1 的二进制表示。我们可以继续减到 10000000,即 -128,再减去 1 得到 01111111,循环往复。
【讨论】: