C - 当负字符总是被编码为二进制的 2 的补码时,负字符中的有符号位在哪里(-128)?

use*_*754 2 c signed twos-complement

  • 我知道有符号整数中的最高有效位用于对符号进行编码。
  • 我还发现负整数几乎总是被编码为其二进制的 2 的补码。

我无法调和上述两个事实。

如果我们看这里的-128的例子,在编码时采取以下步骤

  1. 找出 128 的二进制等价物: 10000000
  2. 取 1 的补码: 01111111
  3. 将 1 与 1 的补码相加得到 2 的补码: 10000000

我的问题是:sign bit负整数的在哪里?换句话说,我想了解如何10000000解码为-128 而不是-0

  1. 如果使用最左边的 1 (MSB) 来编码 -128 的负号,那不是给我们留下了 7 位二进制 0000000,其十进制等效值为 0(而不是 -128)?
  2. 或者计算机是否(当然是比喻性的)——当对存储在某个内存位置的负整数执行计算时——以相反的顺序执行上面的步骤 1-3,以在它看到 1 时解码 1 字节字符的值最重要的位(而不是 0)?
  3. 或者是MSB对-128中第8位(2 ^ 7)的符号和位进行编码。

我已经看到了这个问题,但我的不同,因为我很清楚 +128 不能存储在 1 字节中,因为它的有符号二进制将转换为0100000000需要 9 位。

chu*_*ica 5

负整数的符号位在哪里?

门 #3:“或者是 MSB 编码 -128 中第 8 位 (2^7) 的符号和位

使用 8 位有符号char,编码为2 的补码, M 是 7 并且 ...

符号位的值为-(2 M ) (C17dr § 6.2.6.2 2)

10000000 是 -128 + 0 * 64 + 0 * 32 + 0 * 16 + 0 * 8 + 0 * 4 + 0 * 2 + 0 * 1 --> -128