gpt4 book ai didi

java - 补码误差

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:19 25 4
gpt4 key购买 nike

Finding 2's complement.

If a number is positive, then its representation is same as that of its signed repesentation

0101 􀃆 +5
0110 􀃆 +6
0111 􀃆 +7

If a number is negative, we convert first take one's complement of its signed representation and add one to it.

Like for -7 it is 0111+1=1000

对于 -128,它是 +128 的补码并加一。+128 的符号表示为 010000000(第一个零用于符号)。它的补码是 101111111。将它加一得到 110000000,这是一个九位数字。

因此我们不能以二进制补码形式存储 -128????

最佳答案

8 位值可以表示 0-255 无符号值或 -128 到 +127 有符号值。

  • +128 的 8 位无符号表示是 1000 0000(从您的问题中删除前导 0)。
  • 它的补码是 0111 1111。
  • 加一得到 1000 0000。

也就是-128的补码表示。请注意 -128 的表示与 +128 的表示方式相同。这就是为什么有符号字节最多只能容纳 +127。按照惯例,决定将 1000 0000 解释为 -128 而不是 +128。这是一个明智的决定,因为它让我们可以将最左边的位视为符号位(1 表示负数,0 表示非负数)。


现在您没有说任何关于 8 位的信息,所以您可能想知道为什么我说要删除前导 0。您不必这样做。

关于负数的事情是它们实际上没有“a”符号位。他们有很多。无数个。计算机只能容纳这么多位,但从概念上讲,负数的左边有无限串 1。

让我们通过在 16 位上下文中执行与上述相同的操作来了解我的意思。

  • +128 的 16 位无符号表示是 0000 0000 1000 0000。
  • 它的补码是 1111 1111 0111 1111。
  • 加一得到 1111 1111 1000 0000。

请注意 -128 (1111 1111 1000 0000) 的 16 位表示与 8 位表示 (1000 0000) 的相同之处,只是它的左边有一堆 1。这被称为 sign extension 。如果您使负数变宽,则负数会符号扩展并带有额外的 1。非负数用额外的 0 扩展。

      | 8-bit         | 16-bit
----------------------|--------------------
+128 | 1000 0000 | 0000 0000 1000 0000
-128 | 1000 1000 | 1111 1111 1000 0000

这意味着将最左边的位称为“符号位”有点过于简单化了。如果它是一个符号位,您可以将其翻转以将正数更改为负数。就是这样signed magnitude作品。这不是二进制补码的工作方式。当您对二进制补码中的一个数取反时,您通常最终会翻转左边的一大堆位。

关于java - 补码误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25944522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com