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

时间:2017-11-07 18:44:28

标签: c binary bit-manipulation twos-complement ones-complement

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

不会是:

一个补充:0111 1111

两个补码:0111 1110

没有溢出

但正确的答案是:

一个补充:0111 1111

两个补码:0111 1111

溢出

其他问题:

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

2 个答案:

答案 0 :(得分:4)

一个人和两个人的补语都是表示有符号整数的方法。

对于其补充代表:

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

对于两人的补充陈述:

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

因此,在两个实例中都有128次溢出,因为128的二进制表示是1000 0000,其中一个补码表示-127,而二进制补码表示-128。为了能够在两个和两个补码中表示128,你需要9位,它将表示为0 1000 0000。

答案 1 :(得分:3)

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

0111 1110是126。

comment中所述,0111 1111为127。

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

两个补语和补语都是表示负数的方法。正数只是二进制数;没有补充。

我使用一个补码算术(LINC)在一台计算机上工作。我非常喜欢两个补码,因为只有一个表示为零。两个补码的缺点是有一个值(-128,对于8位数字)不能被否定 - 导致你要问的溢出。唯一的补充并没有这个问题。