为什么 128 在一和二的补码中使用 8 位溢出?

Why is 128 in one and two's complement using 8 bits overflow?

假设我想用 8 位无符号位表示 128 的一和二的补码

那岂不是:

补码:0111 1111

补码:0111 1110

没有溢出

但正确答案是:

补码:0111 1111

补码:0111 1111

溢出

补充问题:

为什么 1 的补码和补码分别是 0000 00010000 0001。你怎么不像我们用 128 那样翻转位?

在8位无符号中,128是1000 0000。在 8 位二进制补码中,该二进制序列被解释为 -128。 8 位二进制补码中没有 128 的表示形式。

0111 1110 是 126.

中所述,0111 1111为127。

参见 https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

二进制补码和一个补码都是表示负数的方法。正数就是二进制数;不涉及补充。

我在一台使用补码算法 (LINC) 的计算机上工作。我非常喜欢二进制补码,因为零只有一种表示形式。二进制补码的缺点是有一个值(-128,对于 8 位数字)不能取反——导致您所询问的溢出。某人的补语没有这个问题。

一补码和补码补码都是表示有符号整数的方法。

补码表示:

  • 正数:用其常规二进制表示法表示
    • 例如:十进制值1在8位补码中表示为0000 0001
  • 负数:通过补其大小的二进制表示来表示
    • 例如:-127 的十进制值将在 8 位补码中表示为 1000 0000,因为 127 的二进制表示为 0111 1111 补码后为 1000 0000

二进制补码表示:

  • 正数:用其常规二进制表示法表示
    • 例如:十进制值1在8位补码中表示为0000 0001
  • 负数:通过补其大小的二进制表示然后将值加1来表示
    • 例如:-127 的十进制值将在 8 位补码中表示为 1000 0001,因为 127 的二进制表示为 0111 1111 补码时为 1000 0000 然后加上 0000 0001 得到 1000 0001

因此,128 在这两种情况下都会溢出,因为 128 的二进制表示形式是 1000 0000,其补码表示 -127,补码表示 -128。为了能够在一个和两个补码中表示 128,您需要 9 位,它将表示为 0 1000 0000。