为什么 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 0001
和 0000 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。
假设我想用 8 位无符号位表示 128 的一和二的补码
那岂不是:
补码:0111 1111
补码:0111 1110
没有溢出
但正确答案是:
补码:0111 1111
补码:0111 1111
溢出
补充问题:
为什么 1 的补码和补码分别是 0000 0001
和 0000 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。