0到128之间的差异

时间:2011-08-12 18:47:29

标签: c++ c computer-architecture

signed integer(使用8位)---范围==> -128 to 127

如果我们考虑2的补语表示:

10000000 =128/(-0) [ Since its 2's Complement is 10000000 ]

所以在某种程度上它是negative零。

现在对于signed整数,128是1000 0000而2的补码也是1000 0000,所以我们没有0的副本[在负面使用这种表示形式?或者我错过了什么?

抱歉打字错误。是的,范围是-128 to 127

但是8位可以在内存10000000中表示此数字。如果这个数字CAN存储在内存中,那它的价值是什么?

6 个答案:

答案 0 :(得分:8)

不,有符号整数的值为10000000不是128,它是-128。最重要的位用作符号位。

答案 1 :(得分:6)

你错过了2的comp中8位数的范围是-128到127,而不是-127到128的事实。你也误解了2的comp是如何工作的,你将它视为{ {3}}

当p达到最大值时,

2的comp循环,你不能简单地通过查看符号位读取,然后将剩余的位看作正常值,然后将两者合并。这将是标志和规模。 e.g。

  • 10000001 - 这是-127, -1
  • 10000010 - 这是-126, -2
  • 10000011 - 这是-125, -3
  

“但是8位可以在内存10000000中表示这个数字。如果这样   数字可以存储在内存中,它的价值是什么?“

它的值是-128。

答案 2 :(得分:2)

“在某种程度上它是负零。”

no 方式为负零。根据定义,x的两个补码是~x+1,并且(假设是8位算术),~0+10000 0000,而不是1000 0000。所以是负零。

正如你所说,1000 0000的两个补码是1000 0000,所以这是另一个值,它就是它自己的否定。

在无符号二进制表示中,1000 0000表示128.在8位二进制补码表示中,它表示-128(这与-127为(~0111 1111)+1的事实一致,即1000 0001 )。它不能代表128 -128,因此它必须是一个或另一个。选择-128具有良好的属性,然后第一位对于负数始终为1,对于非负数用于0,因此可称为“符号位”。

答案 3 :(得分:1)

范围为-128127 -127128-128被编码为0b10000000。请注意,最高位是符号位,因此0b10000000为负数。 -128的两个补码确实是128,但是它超出了整数的范围,无法用它表示。

如果您的整数为16位,-128将由0b11111111100000001280b0000000010000000表示。较低的字节确实是相同的,但整数的其余部分是不同的,这很重要!

所以你的结论128-128是,呃...不变的WRT二补集是错误的。

答案 4 :(得分:0)

10000000不是(-0)。在任何添加中它都不起作为(-0)。

例如:1 +( - 0)= 0000 0001 + 1000 0000 = 1000 0001 = -127

答案 5 :(得分:0)

8位模式10000000确实可以解释为128-128。这只是一个协议问题。

如果我们同意将其解释为128,那么如果8位整数将为-127..128,则2-s补码范围。

如果我们同意将其解释为-128,那么如果8位整数将为-128..127,则2-s补码范围。

标准2的补码表示同意将10000000解释为-128,因为知道所有高阶位为1的表示总是代表数字是相当方便的。因此,在实践中,带符号2的补码表示的范围总是略微“偏移”到负值。

P.S。目前尚不清楚“负零”在哪里出现。 2的补码没有负零。