1

假设我想用 8 位表示 128 的 1 和 2 的补码,没有符号位

那岂不是:

一个人的补充:0111 1111

二进制补码:0111 1110

无溢出

但正确答案是:

一个人的补充:0111 1111

二进制补码:0111 1111

溢出

附加问题:

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

4

2 回答 2

4

One's 和 Two's Complements 都是表示有符号整数的方法。

对于一个人的补码表示:

  • 正数:用它的常规二进制表示来表示
    • 例如:十进制值 1 将在 8 位反码中表示为 0000 0001
  • 负数:通过补充其幅度的二进制表示来表示
    • 例如:-127 的十进制值将在 8 位反码中表示为 1000 0000,因为 127 的二进制表示为 0111 1111 补码时将是 1000 0000

对于二进制补码表示:

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

Therefore, 128 overflows in both instances because the binary representation of 128 is 1000 0000 which in ones complement represents -127 and in twos complement represents -128. In order to be able to represent 128 in both ones and twos complement you would need 9 bits and it would be represented as 0 1000 0000.

于 2017-11-07T19:27:23.197 回答
3

在 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 位数字)不能被否定 - 导致您询问的溢出。一个人的补码没有这个问题。

于 2017-11-07T19:01:26.430 回答