-4

一个signed integer(使用 8 位)--- Range==> -128 to 127

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

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

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

现在对于一个signed整数,128 是1000 00002 的补码也是1000 0000,所以我们难道没有0使用这种表示形式的 [ 负数形式 ​​] 的副本吗?或者我错过了什么?

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

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

4

6 回答 6

8

不,有符号整数的值 10000000 不是 128,而是 -128。最高有效位用作符号位。

于 2011-08-12T18:51:20.323 回答
6

你错过了一个事实,即 2 的 comp 中的 8 位数的范围是 -128 到 127,而不是 -127 到 128。你也误解了 2 的 comp 的工作原理,你把它当作sign 和magnitude

2 的 comp 在达到最大值时循环,您不能简单地通过查看符号位来读取,然后将剩余位视为正常值,然后将两者结合起来。那将是符号和大小。例如

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

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

它的值为-128。

于 2011-08-12T18:51:15.710 回答
2

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

绝不是负零。x根据定义的二进制补码是~x+1, 和 (假设 8 位算术), ~0+1is 0000 0000, not 1000 0000。所以是负零。

正如您所说,1000 0000is的二进制补码1000 0000,所以这是另一个值,它是它自己的否定。

在无符号二进制表示中,表示 128。在 8 位二进制补码表示中,它表示 -128(这与 -127 是, ie1000 0000的事实一致)。它不能同时代表 128-128,所以它必须是其中之一。选择 -128 具有很好的属性,即第一位始终用于负数和非负数,因此可以称为“符号位”。(~0111 1111)+11000 000110

于 2011-08-12T18:55:53.763 回答
1

范围是-128to 127,而不是 -127to 128-128被编码为0b10000000。请注意,最高位是符号位,因此0b10000000是负数。的二进制补码-128确实是128,但这超出了您的整数范围,不能用它来表示。

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

所以你的结论是128,或者-128,是,呃......不变的WRT二进制补码是错误的。

于 2011-08-12T18:55:11.093 回答
0

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

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

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

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

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

于 2011-08-12T19:01:14.837 回答
0

10000000 不是 (-0)。它在任何加法中都不会充当 (-0)。

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

于 2011-08-12T18:57:20.567 回答