C 为什么一加二等于128';使用8位溢出的s补码?

C 为什么一加二等于128';使用8位溢出的s补码?,c,binary,bit-manipulation,twos-complement,ones-complement,C,Binary,Bit Manipulation,Twos Complement,Ones Complement,假设我想用8位,无符号位来表示1和2的补码中的128 那不是: 补语:0111111 两个补码:0111110 无溢出 但正确答案是: 补语:0111111 两个补码:0111111 溢出 附加问题: 为什么1和2的补码中的1分别是0000 0001和0000 0001。为什么不像我们使用128时那样翻转位?在8位无符号中,128是1000 0000。在8位2的补码中,该二进制序列被解释为-128。在8位2的补码中没有128的表示 0111110是126 如a中所述,0111111为127 看

假设我想用8位,无符号位来表示1和2的补码中的128

那不是:

补语:
0111111

两个补码:
0111110

无溢出

但正确答案是:

补语:
0111111

两个补码:
0111111

溢出

附加问题:


为什么1和2的补码中的1分别是
0000 0001
0000 0001
。为什么不像我们使用128时那样翻转位?

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

0111110
是126

如a中所述,
0111111
为127

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


我在一台计算机上使用补码算法(LINC)。我非常喜欢二的补码,因为零只有一种表示。2的补码的缺点是有一个值(-128,代表8位数字)不能被求反——这导致了您所问的溢出。一个人的补码没有这个问题。

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

0111110
是126

如a中所述,
0111111
为127

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


我在一台计算机上使用补码算法(LINC)。我非常喜欢二的补码,因为零只有一种表示。2的补码的缺点是有一个值(-128,代表8位数字)不能被求反——这导致了您所问的溢出。一个补码没有这个问题。

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

对于补语表示:

  • 正数:用正则二进制表示表示
    • 例如:十进制值1将在8位1的补码中表示为0000 0001
  • 负数:以其大小的二进制表示形式表示
    • 例如,-127的十进制值将在8位1的补码中表示为1000 0000,因为127的二进制表示为011111,当补码为1000 0000时
对于二的补语表示:

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

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

1和2的补码都是表示有符号整数的方式

对于补语表示:

  • 正数:用它的正规二进制表示法表示
    • 例如:十进制值1将在8位1的补码中表示为0000 0001
  • 负数:以其大小的二进制表示形式表示
    • 例如,-127的十进制值将在8位1的补码中表示为1000 0000,因为127的二进制表示为011111,当补码为1000 0000时
对于二的补语表示:

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

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

128是10000000,在8位二补中是-128。01111111是127.128,不能用8位的1或2的补码格式表示。“1和2的补码使用8位”!=“无符号位”。@ChristianGibbons但是,如果我的理解是正确的,-128是可表示的,对吗?@Daniel在2的补码中,是的,但不是1的补码。128是10000000,在8位的2的补码中是-128。01111111是127.128不能用8位一或二的补码格式表示。“一和二的补码使用8位”!