問52
頻出度★★☆
負の整数を2の補数で表現するとき,8桁の2進数で表現できる数値の範囲を10進数で表したものはどれか。
这道题的解析和你的作答记录。
負の整数を2の補数で表現するとき,8桁の2進数で表現できる数値の範囲を10進数で表したものはどれか。
−256 ~ 255 合计要表示 512 个数值,是 8 位所能区分的 256 种的 2 倍。这是把 2^8 = 256 这个「种类数」直接当成范围端点数值的错误,8 位根本表示不了这么大的范围。
−255 ~ 256 同样合计有 512 个数值,超出了 8 位的表示能力(256 种)。而且在 2 的补数中,正数的最大值是 2^(n−1)−1 = 127,像 256 这样的值不可能成为正数一侧的上限。
正解 8 位(8 比特)的二进制数所能构成的位模式共有 2^8 = 256 种。在 2 的补数表示法中,最高位被当作符号位处理:最高位为 0 的模式(00000000 ~ 01111111)表示 0 ~ 127,最高位为 1 的模式(10000000 ~ 11111111)表示 −128 ~ −1。因此能够表示的数值范围是 −128 ~ 127,所以选项 ウ 正确。一般来说,n 位的 2 的补数所能表示的范围是 −2^(n−1) ~ 2^(n−1)−1,代入 n=8 即为从 −2^7 = −128 到 2^7−1 = 127。由于 0 只有一种表示方式,负数一侧比正数一侧多 1 个,形成不对称的范围,这正是它的特点。
−127 ~ 128 的个数确实是 256 个,没错,但不对称的方向反了。在 2 的补数中 10000000 表示 −128,所以是负数一侧多 1 个;反过来,+128 无法用 8 位的 2 的补数表示(要表示 +128 需要 9 位)。